编写自己的 IOC 容器

Posted

技术标签:

【中文标题】编写自己的 IOC 容器【英文标题】:Code your own IOC Container 【发布时间】:2010-09-28 01:02:16 【问题描述】:

有没有人用 C# 编写过自己的 IOC 容器?还是绝大多数人都使用各种框架,例如 Spring。各有什么优缺点?

【问题讨论】:

charkit:我认为这个问题本身就与平台无关。有些平台可能会强迫你写一个,因为他们没有现成的,但除此之外...... 【参考方案1】:

编写自己的练习是一个很好的练习,但最终您可能希望使用现有的容器。您可以从这个one 开始,只需 15 行代码。

【讨论】:

然后阅读他关于为什么不应该自己制作的后续文章:ayende.com/Blog/archive/2007/10/20/…【参考方案2】:

我喜欢this 33 line container implementation from Ken Egozi inspired by Ayende's 15 liner

【讨论】:

嗯 - 我不知道我怎么错过了这个答案:) @KenEgozi 我认为您的促销、营销和 SEO 团队需要采取行动:D 是的,我肯定会动摇他们的船! 死链接,可以通过从末尾删除正斜杠来修复。 @callumWatkins 感谢您的提醒;固定的。如果我再次看到此评论并带有 ack 而您的已消失,我将删除此...【参考方案3】:

有人用 C# 写过一个:http://ninject.org/。

它是开源的,因此您可以获取代码并看看这个人是如何做到的。

【讨论】:

是的,为什么要自己写。就用这个。 Phil Haack(MVC 团队的经理)也将它用于 Subtext。【参考方案4】:

除非有很好的理由,否则我不会重新发明***并自己实现 IoC 容器,特别是因为有很多不错的选择,例如 Unity、Ninject 或 Spring.net。

如果您需要/想要删除对任何这些 IoC 容器的依赖,您可以尝试Common Service Locator 接口。

【讨论】:

【参考方案5】:

我用 c# 编写了一个 IoC / DI 容器,它实现了 Common Service Locator。我写它主要是为了学习目的,但是当我完成它时,我决定让它开源。如果大家想试试IInject,可以下载here。

【讨论】:

【参考方案6】:

如果您正在寻找轻量级和高性能的 IoC 容器,那么您应该查看Munq

【讨论】:

【参考方案7】:

James Kovacs 介绍了有关此主题的 dnrTV 剧集here。这里还写了an article。然而,在文章中,他提到您可能想要使用其中一个预建的。因为它们有很多不同的外观。 Ninject、StructureMap、Autofac 使用流畅的接口。 Spring、Castle Windsor 和 Unity 更多地是 XML 配置驱动的。 Castle Windsor 也可以使用 boo 作为界面。许多人都与其他框架挂钩,例如 Unity 与 EntLib 或 Castle Windsor 与 Monorail 以及 Castle Project 的其余部分。

因此,除非您确实需要或想要 IOC 框架未提供的东西,否则为什么不使用其中之一。

【讨论】:

【参考方案8】:

Autofac 非常好。

我自己用不到 15 行写了一个。字典只有两个扩展方法。

【讨论】:

【参考方案9】:

IOC 容器并不难写,它只是一个管理良好的全局递归工厂,具有一些潜在的附加功能。 使用字典、反射和委托来注册和构建一个简单的容器...

真正的问题是另一个新的 IOC 容器框架为什么以及如何带来好处?

在大多数情况下,您认为您需要更高的性能?不存在的功能?但大多数时候,现有的框架正是你所需要的,而且足够了,除非你已经意识到框架强迫你去使用它的所有废话。

对ioc容器框架的所有实现感到失望,它具有反模式顺序的功能,但还有古怪和不可靠的语法,更糟糕的是强加耦合,我决定亲自体验一下.这就是我将自己的(非常轻量的)IOC 容器作为开源的原因。

你可以在这里查看:Puresharp API .net 4.5.2+

【讨论】:

【参考方案10】:

Ayende 还在他的博文Building an IoC container in 15 lines of code 中写过关于编写自己的 IoC 容器的文章,但我相信他和其他人的观点是一样的:如果没有必要,不要自己构建。

【讨论】:

复制***.com/questions/386535/…【参考方案11】:

我创建了自己的 IoC 容器,这使得它更容易调试对象的创建(即使您无法访问容器代码)。创建对象后,按下 Step into (F11) 时,您会看到创建对象的代码。完整代码可见here。

【讨论】:

【参考方案12】:

问题是有太多的 IoC 和 DI 库让您感到困惑。当您使用其中一个开发某些东西并且您成长时,您会将您的产品与此类工具紧密结合,您将需要这些工具的专家来继续开发。这完全取决于公司的政治和设计的复杂性。

我自己计划手动完成,因此没有太多隐藏代码。我知道有很多很棒的开源 IoC 工具,但谁真正通过代码并试图理解?

不是要重新发明***,但有时如果您可以自己定制更适合您的产品的***,这会很好。

【讨论】:

以上是关于编写自己的 IOC 容器的主要内容,如果未能解决你的问题,请参考以下文章

Spring IOC容器

Castle IOC容器与Spring.NET配置之比较

IOC和DI的理解

spring 学习 二 IOC/DI

ioc、aop以及di

Spring核心技术IoC容器