比较Castle Windsor、Unity和StructureMap

52

Krzysztof的声明后续中,他提到Windsor比其他IoC做得更多,我想了解这些IoC之间的差异以及Castle Windsor提供的好处/额外设施。

是否有任何比较?有人可以帮助我理解Castle Windsor相对于其他IoC提供的附加功能吗?


2个回答

50

请参考此处此处,了解几个IoC容器的相当详细的技术比较(虽然这些比较有点过时了,因为它们在 Windsor 2.0 之前)。

然而,我不认为 Windsor 提供了其他容器没有的真正的重要功能。WindsorStructureMapSpring.NET已经存在多年,在这些年中被用于许多项目,因此它们现在非常成熟。像AutofacUnityNinjectSimpleInjector这样的新容器都建立在以前的经验基础上,因此它们也不会缺少那些重要的功能。

现在是回答中更主观的部分:我认为 Windsor 具有良好的可用性、可扩展性和集成模块的混合特性。

可用性:例如,您可以使用 XML 和/或代码注册(它也像大多数容器一样拥有流畅 API)。

可扩展性许多扩展点,您可以使用它们来自定义或覆盖几乎任何默认行为。

集成: Windsor有许多设施(模块),可轻松集成其他框架/库。其他集成包括ASP.NET MVCMonoRailWorkflow FoundationNServiceBusMassTransitRhino Service BusQuartz.NetSolrNetSolrSharpWindows传真服务

这系列文章涵盖了Windsor的许多细节和扩展点。

请注意,我并是说其他容器没有提供类似的功能!即使你选择了其中一个,后来发现它缺少一些集成功能,通常也不难自己编写代码实现。

底线:只要您正确地组织您的代码(例如,避免使用服务定位器反模式),我认为您可以选择任何主要的IoC容器而不会出错。


你能提供一个服务定位器反模式的参考链接吗?谢谢。 - Ruben
@Ruben:在谷歌上有几篇文章:http://www.google.com/search?hl=en&q=service+locator+anti-pattern - Mauricio Scheffer
8
是的,我试过了。我希望你有一个具体的链接在脑海中。我认为这是最好的解释:http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx - Ruben

20
对我来说,Windsor有两个杀手级功能,我认为大多数其他容器都没有提供。
  • 在容器无关的方式下工作的能力-这意味着您的容器可以为您引导所有代码,并且您可以充分利用其丰富的功能,而不必在非基础设施程序集中引用任何Castle.*.dll程序集。这要归功于一些功能,例如惰性组件加载器、DynamicParameters和Typed Factory Facility,它们不会限制您利用容器的高级功能,同时避免手动编写集成层,或使用Service Locator,如@ploeh所写,这是一种反模式。

  • 非常丰富的可扩展性/扩展生态系统,可以为您提供非常强大的功能,并极大地减少您需要编写的管道代码量。这可能听起来不太强大,但是一旦您利用像在一个项目中使用WCF Facility,然后在另一个项目中您将无法使用它时,您就会感激它。 可扩展性部分意味着,虽然Windsor不试图(这是其设计目标)在出厂时解决您可能遇到的每个问题,但它非常可扩展,这意味着您可以调整和扭曲它以执行几乎任何您可能需要的操作。

除此之外,我只是碰巧喜欢温莎的工作方式,它基本上表现出色(与其他一些容器相反),以及它如何解决小问题。例如,创建装饰服务非常简单。我也非常喜欢它流畅的注册API,它非常适用于简单的场景,并且当您想要做一些高级操作时,不会变得过于扭曲和复杂。还有很多其他小事情,尽管这里的事情可能相当主观。

你能否发布一个关于第一点如何工作的链接?它是否类似于常见的服务定位器? - Quintin Par
http://google.com 是你的好朋友。我一旦有时间就会改进这方面的文档。我的博客上也有关于每个功能的博客文章。 - Krzysztof Kozmic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接