我应该使用哪种dependency injection工具?

我正在考虑在我们的用户界面中使用Microsoft Unity作为我的dependency injection工具。

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

有没有人有什么最好的dependency injection工具是什么想法?

  • Autofac
  • 城堡MicroKernel /温莎
  • PicoContainer.NET
  • Puzzle.NFactory
  • Spring.NET
  • StructureMap
  • Ninject
  • 统一
  • 简单的喷油器
  • NauckIT.MicroKernel
  • WINTER4NET
  • ObjectBuilder的

如果您的系统是根据IoC / DIdevise的,那么坚持一个容器并不重要。 通过适当的方法,您可以轻松地在路上更改IoC库。

当然,容器必须提供足够的灵活性来支持常用的场景(生命周期pipe理,适当的容器嵌套,XML和代码configuration,拦截,快速parsing)。

我build议select城堡(广泛使用和有很多集成库)和Autofac(轻量级,快速和适当的容器嵌套,但没有广泛使用)

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

PS:你不想使用Unity

在最近使用了其中的6个( Windsor , Unity , Spring.Net , Autofac , Ninject , StructureMap )之后,我可以简单地总结一下我们的select标准和最终select。

注意:我们并没有把PicoContainer.Net看作是我们团队认为.Net端口在Java版本上相当差的一个。 我们也没有看ObjectBuilder,因为Unity是build立在ObjectBuilder2的基础上的,默认情况下它被认为是最好的select。

首先,我可以说,或多或less,他们都是非常相似的,这真的归结为什么最适合你,以及你的具体要求。 我们的要求包括:

要求

  • 基于构造函数的注入(我们打算使用属性,字段或方法注入)
  • 可编程configuration( 不是 XML)
  • 容器层次结构(每个应用程序一个,每个请求和每个会话更隐式地将组件生命周期范围绑定到容器)
  • 组件生命周期pipe理(用于更详细的范围如瞬态/单例)
  • 从接口注入到types或具体实例(例如ILogger -> typeof(FileLogger)ILogger -> new FileLogger()
  • 高级组件创build/“creaton事件机制”用于初始化/初始化
  • 正确处理容器拆卸中的IDisposable部件
  • 有据可查的和/或在线信息容易获得

    注:虽然绩效是一项要求,但在select时没有考虑因素,因为根据这一基准 ,所有审查的容器似乎都是相似的

testing

每个容器都用在一个典型的Asp.Net webforms项目中(因为这是我们的目标应用程序types)。 我们使用一个简单的页面和一个简单的用户控件,每个控件分别从一个基本页面/基本控件inheritance。 我们在BasePage为“per request”范围容器使用了1个容器,在“application”范围的global.asax上使用了1个容器,并尝试将它们链接在一起,以便可以从两个容器中parsing依赖关系。

每个Web应用程序都共享一组模拟多级依赖性,范围types(​​单例/瞬态)以及托pipe和非托pipe类(需要IDisposable )的域对象。 “顶级”依赖项组件是从BasePage上的方法手动注入的。

结果

温莎 – 满足所有的标准,并有一个良好的病史,博客社区和在线文档。 易于使用,可能是事实上的select。 通过工厂设施创build高级组件。 也允许链接单独创build的容器。

Spring.Net – 详细和无用的文档,并没有明显的/易于编程configuration。 不支持generics。 没有select

Ninject – 易于使用和清晰的文档。 强大的function集满足我们所有的要求,除了容器层次,所以不幸的是没有select。

StructureMap – 虽然有相当先进的特性集,但是它没有内置的容器层次结构,尽pipe可以使用for循环来攻击它们。 这里看到的lambdaexpression式stream畅接口看起来有点过了起初很复杂,虽然可以封装掉。

统一 – 有据可查,易于使用,并符合我们所有的select标准,并有一个简单的扩展机制,添加我们所需的前/后创build事件机制。 子容器必须从父容器创build。

Autofac – logging良好且相对容易使用,尽pipelambdaexpression式configuration看起来有些过于复杂,但同样可以轻松地封装起来。 组件的作用是通过“标签”机制来实现的,所有组件都使用一个稍微不方便的build造者来configuration。 子容器是从父级创build的,并从“标签”分配了组件。 允许通用注入。

结论

我们最后的select是在Windsor和Unity之间,这次我们select了Unity,因为它的易用性,文档,扩展系统以及处于“生产”状态。

一年前我开始使用Autofac ,自从…

我是Autofac的粉丝,但是Windsor和Unity都会做得很好(尽pipeWindsor比团结更有能力,并且不需要归功于你的代码)。 尽pipe在系统中粘贴单个容器有很多非技术性的理由。

使用什么工作。 大多数function都是独一无二的,几乎所有function都比Unity更丰富。 如果团结是你所需要的一切,你当然可以使用它。

仅仅因为来自微软而使用微软的团结是做出决定的糟糕方式。 想想你需要什么,为什么,并select一个适合你的需求。

但是,如果可能的话,我第二个坚持一个容器的概念。

我一直在使用托pipe扩展框架 ,发现它很容易处理。 它已被集成到.NET 4中 。

除非您已经有了一种可能的IoC容器解决scheme所使用的特定子技术的经验和个人优先权,否则它们都运行良好,我没有看到任何特别的“杀手function”使其脱颖而出从其他人。 Unity可能是已经使用P&P Enterprise Library 4.x的解决scheme的最佳select。

IoC容器基准 – 性能比较具有20多种产品的性能和function比较表,并保持最新。

文章的结论是:

SimpleInjector,Hiro,Funq,Munq和Dynamo提供了最好的性能,它们非常快。 给他们一个尝试!

尤其是简单的喷油器似乎是一个不错的select。 它非常快,有一个很好的文档,并支持先进的scheme,如拦截和通用装饰器。