【发布时间】:2010-09-28 01:02:16
【问题描述】:
有没有人用 C# 编写过自己的 IOC 容器?还是绝大多数人都使用各种框架,例如 Spring。各有什么优缺点?
【问题讨论】:
-
charkit:我认为这个问题本身就与平台无关。有些平台可能会强迫你写一个,因为他们没有现成的,但除此之外......
标签: c# inversion-of-control ioc-container
有没有人用 C# 编写过自己的 IOC 容器?还是绝大多数人都使用各种框架,例如 Spring。各有什么优缺点?
【问题讨论】:
标签: c# inversion-of-control ioc-container
编写自己的练习是一个很好的练习,但最终您可能希望使用现有的容器。您可以从这个one 开始,只需 15 行代码。
【讨论】:
【讨论】:
有人用 C# 写过一个:http://ninject.org/。
它是开源的,因此您可以获取代码并看看这个人是如何做到的。
【讨论】:
除非有很好的理由,否则我不会重新发明轮子并自己实现 IoC 容器,特别是因为有很多不错的选择,例如 Unity、Ninject 或 Spring.net。
如果您需要/想要删除对任何这些 IoC 容器的依赖,您可以尝试Common Service Locator 接口。
【讨论】:
如果您正在寻找轻量级和高性能的 IoC 容器,那么您应该查看Munq
【讨论】:
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 框架未提供的东西,否则为什么不使用其中之一。
【讨论】:
Autofac 非常好。
我自己用不到 15 行写了一个。字典只有两个扩展方法。
【讨论】:
IOC 容器并不难写,它只是一个管理良好的全局递归工厂,具有一些潜在的附加功能。 使用字典、反射和委托来注册和构建一个简单的容器...
真正的问题是另一个新的 IOC 容器框架为什么以及如何带来好处?
在大多数情况下,您认为您需要更高的性能?不存在的功能?但大多数时候,现有的框架正是你所需要的,而且足够了,除非你已经意识到框架强迫你去使用它的所有废话。
对ioc容器框架的所有实现感到失望,它具有反模式顺序的功能,但还有古怪和不可靠的语法,更糟糕的是强加耦合,我决定亲自体验一下.这就是我将自己的(非常轻量的)IOC 容器作为开源的原因。
你可以在这里查看:Puresharp API .net 4.5.2+
【讨论】:
Ayende 还在他的博文Building an IoC container in 15 lines of code 中写过关于编写自己的 IoC 容器的文章,但我相信他和其他人的观点是一样的:如果没有必要,不要自己构建。
我创建了自己的 IoC 容器,这使得它更容易调试对象的创建(即使您无法访问容器代码)。创建对象后,按下 Step into (F11) 时,您会看到创建对象的代码。完整代码可见here。
【讨论】:
问题是有太多的 IoC 和 DI 库让您感到困惑。当您使用其中一个开发某些东西并且您成长时,您会将您的产品与此类工具紧密结合,您将需要这些工具的专家来继续开发。这完全取决于公司的政治和设计的复杂性。
我自己计划手动完成,因此没有太多隐藏代码。我知道有很多很棒的开源 IoC 工具,但谁真正通过代码并试图理解?
不是要重新发明轮子,但有时如果您可以自己定制更适合您的产品的轮子,这会很好。
【讨论】: