有没有人用 C# 编写过自己的 IOC 容器?还是绝大多数人都使用各种框架,例如 Spring。各自的优缺点是什么?
12 回答
自己编写是一个很好的练习,但最终您可能想要使用现有的容器。您可以从15 行代码中的这一行开始。
有人用 C# 写过一个:http: //ninject.org/。
它是开源的,因此您可以获取代码并看看这个人是如何做到的。
除非有很好的理由,否则我不会重新发明轮子并自己实现 IoC 容器,特别是因为有很多不错的选择,例如Unity、 Ninject 或Spring.net。
如果您需要/想要删除对任何这些 IoC 容器的依赖关系,您可以尝试Common Service Locator接口。
如果您正在寻找轻量级和高性能的 IoC 容器,那么您应该查看Munq
James Kovacs 在这里展示了关于这个主题的 dnrTV 剧集。这里还写了一篇文章。然而,在文章中,他提到您可能想要使用其中一个预建的。因为它们有很多不同的外观。Ninject、StructureMap、Autofac 使用流畅的接口。Spring、Castle Windsor 和 Unity 更多地是 XML 配置驱动的。Castle Windsor 也可以使用 boo 作为界面。许多人都与其他框架挂钩,例如 Unity 与 EntLib 或 Castle Windsor 与 Monorail 以及 Castle Project 的其余部分。
因此,除非您真的需要或想要 IOC 框架未提供的东西,否则为什么不使用其中之一。
Autofac非常好。
我自己用不到 15 行写了一个。字典只有两种扩展方法。
IOC 容器并不难写,它只是一个管理良好的全局递归工厂,具有一些潜在的附加功能。使用字典、反射和委托来注册和构建一个简单的容器......
真正的问题是另一个新的 IOC 容器框架为什么以及如何带来好处?
在大多数情况下,您认为您需要更高的性能?不存在的功能?但大多数时候,现有的框架正是你所需要的,并且足够了,除非你已经意识到框架强迫你使用它的所有废话。
对 ioc 容器框架的所有实现感到失望,它具有反模式级别的功能,但也有古怪和不可靠的语法,更糟糕的是强加耦合,我决定亲自体验一下。这就是为什么我将自己的(非常轻的)IOC 容器作为开源的。
你可以在这里查看:Puresharp API .net 4.5.2+
Ayende还在他的博客文章《用 15 行代码构建 IoC 容器》中写到了关于编写自己的 IoC 容器的内容,但我相信他和其他人的观点相同:如果没有必要,不要构建自己的容器。
我创建了自己的 IoC 容器,它可以更轻松地调试对象的创建(即使您无法访问容器代码)。创建对象后,按下 Step into (F11) 时,您会看到创建对象的代码。完整的代码可以在这里看到。
问题是有太多的 IoC 和 DI 库让你感到困惑。当您使用其中一个开发某些东西并且您成长时,您会将您的产品与此类工具紧密结合,您将需要这些工具的专家来继续开发。这完全取决于公司的政治和设计的复杂性。
我自己计划手动完成,因此没有太多隐藏代码。我知道有很多很棒的开源 IoC 工具,但谁真正通过代码并试图理解?
不是要重新发明轮子,但有时如果您可以自己定制更适合您的产品的轮子,那会很好。