我应该使用哪个依赖性注入工具?

时间:2020-03-06 14:52:37  来源:igfitidea点击:

我正在考虑将Microsoft Unity用于我们的用户界面中的依赖注入工具。

我们的中间层已经使用了温莎城堡,但我认为我应该坚持使用微软。

有人对最佳的依赖注入工具有什么想法吗?

  • Autofac
  • 城堡微内核/温莎
  • PicoContainer.NET
  • 益智游戏
  • Spring.NET
  • 结构图
  • Ninject
  • 统一
  • 简单喷油器
  • NauckIT.MicroKernel
  • WINTER4NET
  • 对象构建器

解决方案

我是Autofac爱好者,但是Windsor和Unity都可以做得很好(尽管Windsor比unity更有能力,并且不需要注明代码)。但是,有很多非技术性的原因会粘附在系统中的单个容器上。

https://stackoverflow.com/questions/71041/which-single-iocdi-container-would-you-recommend-using-and-why

使用有效的方法。大多数功能具有它们独有的功能,并且几乎所有功能都比Unity功能丰富。如果我们只需要团结,那么我们当然可以使用它。

仅仅因为微软的团结而使用微软的团结是做出决定的糟糕方法。考虑一下需求以及原因,然后选择适合我们需求的需求。

但是,如果可能的话,我坚持紧贴单个容器的观点。

如果系统在设计时就考虑了IoC / DI,那么紧贴一个容器并不是很重要。使用正确的方法,我们可以轻松地更改IoC库。

并且,当然,容器必须提供足够的灵活性来支持广泛使用的常见场景(生命周期管理,适当的容器嵌套,XML和代码配置,拦截,快速解析)。

我建议在Castle(广泛使用并且有很多集成库)和Autofac(轻便,快速且具有适当的容器嵌套,但使用范围不广)之间进行选择

有Hanselman提供的IoC容器的完整列表

PS:我们不想使用Unity

这是一篇比较.NET IoC容器的好文章。
http://blog.ashmind.com/index.php/2008/08/19/comparing-net-di-ioc-frameworks-part-1/

除非我们已经对其中一种可能的IoC容器解决方案所采用的特定子技术有经验和个人喜好,否则它们都将很好地发挥作用,并且我看不到特别具有"杀手级功能"的任何一种使它脱颖而出从其他。 Unity可能最适合已经利用P&P Enterprise Library 4.x解决方案的解决方案...

在最近增加了其中6种(Windsor,Unity,Spring.Net,Autofac,Ninject,StructureMap)的使用之后,我可以提供每种方法,我们的选择标准和最终选择的快速摘要。

注意:我们没有看PicoContainer.Net,因为我们的一个团队认为.Net端口与Java版本相比非常差。我们也没有看过ObjectBuilder,因为Unity是在ObjectBuilder2之上构建的,默认情况下被认为是上乘的选择。

首先,我可以说所有这些或者多或者少都非常相似,这实际上取决于最适合内容以及特定要求。我们的要求包括:

要求

  • 基于构造函数的注入(我们不打算使用属性,字段或者方法注入)
  • 可编程配置(非XML)
  • 容器层次结构(每个应用程序,每个请求和每个会话一个,以更隐式地将组件生存期范围绑定到容器)
  • 组件寿命管理(用于更精细的范围界定,例如瞬态/单例)
  • 从接口注入到类型或者具体实例(例如," ILogger-> typeof(FileLogger)"或者" ILogger-> new FileLogger()")
  • 先进的组件创建/" creaton事件机制",用于初始化之前/之后
  • 正确拆卸集装箱上的" IDisposable"组件
  • 记录良好和/或者在线信息随时可用注意:虽然性能是必需条件,但在选择时没有考虑到该因素,因为根据该基准,似乎所有检查过的容器都是相似的

测试

每个容器都在典型的Asp.Net Webforms项目中使用(因为这是我们的目标应用程序类型)。我们使用了一个简单页面和一个简单用户控件,每个控件分别继承自基本页面/基本控件。我们在BasePage上将1个容器用于"每个请求"作用域容器,在global.asax上将1个容器用于"应用程序"作用域,并尝试将它们链接在一起,以便可以从两个容器中解析依赖项。

每个Web应用程序共享一组伪造的域对象,它们模拟依赖关系,范围类型(​​单例/瞬态)以及托管类和非托管类(需要IDisposable)的多级。从" BasePage"上的方法手动注入了"顶层"依赖项组件。

结果

温莎满足所有条件,并拥有良好的案例记录,博客社区和在线文档。易于使用,可能是事实上的选择。通过工厂工厂创建高级组件。还允许链接单独创建的容器。

Spring.Net详细而又无助的文档,没有明显的内容/易于进行可编程配置。不支持泛型。未选择

Ninject易于使用,带有清晰明了的文档。不幸的是,没有选择功能强大的功能集来满足我们除容器层次结构之外的所有要求。

结构化文档记录不佳,尽管具有可以满足我们所有要求的高级功能集,但是尽管可以使用for循环将它们合并在一起,但是没有用于容器层次结构的内置机制,请参见此处。起初虽然可以封装起来。

Unity有据可查,易于使用并满足我们所有的选择标准,并且具有易于扩展的机制来添加我们所需的创建前/发布后事件的机制。子容器必须从父容器创建。

Autofac资料丰富,相对易于使用,尽管lambda表达式配置似乎有些复杂,但是可以很容易地将其封装起来。组件作用域通过"标记"机制实现,所有组件都使用构建器预先配置,这有点不方便。子容器是从父容器创建的,并通过"标签"分配了组件。允许通用注射。

总结

我们的最终选择是在Windsor和Unity之间,而这次我们选择Unity是因为它的易用性,文档,扩展系统以及处于"生产"状态。

我一年前开始使用Autofac,此后再也没有回头。

我一直在使用Managed Extensibility Framework,发现使用起来非常容易。它已集成到.NET 4中。