比较Castle Windsor,Unity和StructureMap

在跟随Krzysztof的声明 , 温莎做了比其他IoC更多,我想了解这些IoC的相互堆叠和城堡温莎提供的好处/额外设施。

有比较吗? 有人可以帮助我了解Castle Windsor提供的其他IoCfunction吗?

看到这里和这里几个IoC容器的一个非常彻底的技术比较,虽然有点过时了(他们来自温莎2.0之前)

不过,我不认为温莎提供的其他任何重要function都不具备。 Windsor , StructureMap , Spring.NET已经有好几年了,这些年来已经在很多项目中使用过,所以现在已经非常成熟了。 较新的容器,如Autofac , Unity , Ninject和SimpleInjector构build在以前的经验,所以他们也不会缺乏这些重要的function。

现在答案中更主观的部分是:我喜欢认为Windsor在可用性,可扩展性和集成模块方面有很好的结合。

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

可扩展性 : 许多扩展点可用于自定义或覆盖几乎所有的默认行为。

整合 :Windsor拥有许多设施 (模块),可以方便地与其他框架/库集成。 其他集成包括ASP.NET MVC , MonoRail , Workflow Foundation , NServiceBus , MassTransit , Rhino服务总线 , Quartz.Net , SolrNet , SolrSharp , Windows传真服务 。

这一系列文章涵盖了温莎的许多优点和延伸点。

请注意,我不是说其他容器不提供类似的东西! 即使你select了其中一个,后来发现它缺less一些整合,通常你自己编写代码也不难。

底线 :只要你正确地构build你的代码(例如避免服务定位器反模式),我认为你不会对任何主要的IoC容器出错。

对我来说,温莎有两个杀手function,我不相信大多数其他容器提供。

  • 能够以容器不可知的方式工作 – 这意味着您的容器可以为您启动所有代码,并且可以充分利用其丰富的function,而无需在非基础结构程序集中引用任何Castle。*。dll程序集。 这要归功于诸如惰性组件加载器,DynamicParameters和Typed Factory Facility等function,它们不会限制您利用容器的高级function,同时避免手动编码集成层,或者使用Service Locator,它是@ploeh写的反模式。

  • 非常丰富的可扩展性/扩展生态系统,可以给你真正强大的function,并大大减less你必须编写的pipe道代码的数量。 这听起来可能不是很强大,但是如果在一个项目中利用诸如WCF工具之类的东西,然后在另一个项目中,您将无法使用它。 可扩展性部分意味着虽然Windsor不会尝试(这是它的devise目标)来解决您可能已经开箱即可的每个问题,但它是非常可扩展的,这意味着您可以调整和扭曲它,以完成您可能需要的任何事情。

除此之外,我只是喜欢温莎的方式,正如预期的那样( 与其他容器相反 )以及它如何解决小事情 。 例如创build装饰服务非常简单。 我也非常喜欢它stream畅的注册API,对于这两种简单的场景都非常有效,而且当你想要做一些先进的事情时,不会过于扭曲和复杂。 加上很多其他的小东西,虽然在这里可以是非常主观的。