当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《我应该使用哪种依赖注入工具?》经验,为你挑选了4个好方法。

我正在考虑在用户界面中使用Microsoft Unity作为我的依赖注入工具.

我们的中间层已经使用Castle Windsor,但我认为我应该坚持使用Microsoft.

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

Autofac

Castle MicroKernel/Windsor

PicoContainer.NET

Puzzle.NFactory

Spring.NET

StructureMap

Ninject

统一

简单的注射器

NauckIT.MicroKernel

WINTER4NET

ObjectBuilder的

Xian.. 61

最近我们使用了其中的6个(Windsor,Unity,Spring.Net,Autofac,Ninject,StructureMap),我可以快速总结每个,我们的选择标准和我们的最终选择.

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

首先,我可以说它们或多或少都非常相似,它真正归结为最适合你的东西,以及你的具体要求.我们的要求包括:

要求

基于构造函数的注入(我们打算使用属性,字段或方法注入)

可编程配置(不是 XML)

容器层次结构(每个应用程序,每个请求和每个会话一个,以更隐式地将组件生命周期范围绑定到容器)

组件生命周期管理(用于更细粒度的范围,例如瞬态/单例)

从接口到类型或具体实例的注入(例如ILogger -> typeof(FileLogger)ILogger -> new FileLogger())

用于初始化/后期初始化的高级组件创建/"创建事件机制"

正确处理IDisposable容器上的组件拆卸

随时可用的文档和/或在线信息

注意:虽然性能是一项要求,但在选择中没有考虑因素,因为根据该基准测试,所有评估的容器似乎都是相似的

测试

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

每个Web应用程序共享一组设计的域对象,模拟多级依赖关系,范围类型(​​单例/瞬态)以及托管和非托管类(IDisposable必需)."顶级"依赖组件是从上面的方法手动注入的BasePage.

结果

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

Spring.Net - 详细和无用的文档,并且没有明显/易于编程的配置.不支持泛型.没选择

Ninject - 易于使用,具有良好的清晰文档.功能强大的功能集满足了除容器层次结构之外的所有要求,因此不幸的是没有选择.

StructureMap - 文档很少,虽然有相当高级的功能集满足了我们的所有要求,但是没有内置的容器层次结构机制,虽然可以使用for循环一起被黑客攻击看到这里 lambda表达式流畅的界面确实看起来有点过了起初很复杂,虽然可以封装掉.

Unity - 记录良好,易于使用并符合我们的所有选择标准,并具有简单的扩展机制,可添加我们所需的前/后创建事件机制.必须从父容器创建子容器.

Autofac - 记录良好且相对易于使用,虽然lambda表达式配置似乎有点过于复杂,但同样可以很容易地封装掉.组件范围是通过"标记"机制实现的,所有组件都是使用构建器预先配置的,这有点不方便.子容器是从父级创建的,并从"标记"分配了组件.允许通用注射.

结论

我们的最终选择是在Windsor和Unity之间,这次我们选择了Unity,因为它易于使用,文档,扩展系统,并且处于"生产"状态.



1> Xian..:

最近我们使用了其中的6个(Windsor,Unity,Spring.Net,Autofac,Ninject,StructureMap),我可以快速总结每个,我们的选择标准和我们的最终选择.

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

首先,我可以说它们或多或少都非常相似,它真正归结为最适合你的东西,以及你的具体要求.我们的要求包括:

要求

基于构造函数的注入(我们打算使用属性,字段或方法注入)

可编程配置(不是 XML)

容器层次结构(每个应用程序,每个请求和每个会话一个,以更隐式地将组件生命周期范围绑定到容器)

组件生命周期管理(用于更细粒度的范围,例如瞬态/单例)

从接口到类型或具体实例的注入(例如ILogger -> typeof(FileLogger)ILogger -> new FileLogger())

用于初始化/后期初始化的高级组件创建/"创建事件机制"

正确处理IDisposable容器上的组件拆卸

随时可用的文档和/或在线信息

注意:虽然性能是一项要求,但在选择中没有考虑因素,因为根据该基准测试,所有评估的容器似乎都是相似的

测试

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

每个Web应用程序共享一组设计的域对象,模拟多级依赖关系,范围类型(​​单例/瞬态)以及托管和非托管类(IDisposable必需)."顶级"依赖组件是从上面的方法手动注入的BasePage.

结果

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

Spring.Net - 详细和无用的文档,并且没有明显/易于编程的配置.不支持泛型.没选择

Ninject - 易于使用,具有良好的清晰文档.功能强大的功能集满足了除容器层次结构之外的所有要求,因此不幸的是没有选择.

StructureMap - 文档很少,虽然有相当高级的功能集满足了我们的所有要求,但是没有内置的容器层次结构机制,虽然可以使用for循环一起被黑客攻击看到这里 lambda表达式流畅的界面确实看起来有点过了起初很复杂,虽然可以封装掉.

Unity - 记录良好,易于使用并符合我们的所有选择标准,并具有简单的扩展机制,可添加我们所需的前/后创建事件机制.必须从父容器创建子容器.

Autofac - 记录良好且相对易于使用,虽然lambda表达式配置似乎有点过于复杂,但同样可以很容易地封装掉.组件范围是通过"标记"机制实现的,所有组件都是使用构建器预先配置的,这有点不方便.子容器是从父级创建的,并从"标记"分配了组件.允许通用注射.

结论

我们的最终选择是在Windsor和Unity之间,这次我们选择了Unity,因为它易于使用,文档,扩展系统,并且处于"生产"状态.


有趣的是看到接受的答案说要远离Unity,而最有选择的答案选择Unity!
是的,我认为这也很有趣.我们对所有容器给予了相同的测量,并且忽略了反MS偏差.然而,每种情况都不同,人们应该选择适合他们的解决方案.碰巧我们结束了重新发明轮子并写下了我们自己的,我们很快就会开源

2> Rinat Abdull..:

如果您的系统在设计时考虑到IoC/DI,那么坚持使用一个容器并不重要.通过适当的方法,您可以轻松地更改IoC库.

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

我建议在Castle(广泛使用并拥有大量集成库)和Autofac(轻量级,快速且具有适当的容器嵌套,但不是广泛使用)之间进行选择

Hanselman提供了一个完整的IoC容器列表

PS:你不想使用Unity


你能详细说明Unity的评论吗?为什么这是一个糟糕的选择?
同意Unity.

3> aogan..:

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



4> Carl Hörberg..:

我一年前开始使用Autofac,自那以后就没有回头了......

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有