针对DI的Ninject vs Unity

Mir*_*ral 100 asp.net-mvc ninject unity-container

我们正在使用ASP.net MVC.

哪个是最好的DI框架Ninject或Unity?为什么?

Men*_*elt 45

上次我看到他们中的任何一个,我发现Ninject略胜一筹.但两者都有其缺点.

Ninject有一个更好的流畅配置方案.Unity似乎主要依赖于XML配置.Ninject的主要缺点是它需要您在代码中的任何地方引用Ninject.Core来添加[Inject]属性.

如果我可能会问,你为什么要限制你对这两个人的选择?我认为Castle.Windsor,Autofac和StructureMap至少同样好或更好.

  • 如果有多个构造函数,则只需要使用Inject属性,并且需要告诉Ninject使用哪个构造函数.默认情况下,它使用具有最多参数的构造函数. (47认同)
  • 这个答案现在与reinrd与Ninject 2完全无关.虽然投诉对于Ninject 1来说是合法的,但Ninject 2允许一个人工作而不会乱丢那些带有属性的类.ninject2将透明运行,无需修改您的类. (18认同)
  • 与此同时,还有一个官方的Ninject.Web.Mvc扩展.您将MvcApplication更改为从NinjectHttpApplication派生,在其中启动内核并调用RegisterAllControllersIn(Assembly.GetExecutingAssembly())以使其处理给定程序集中的所有控制器.魔法. (11认同)
  • 同样是统一的,因为此时它似乎可以通过代码完全配置(v3.0.1304.1) (3认同)

rob*_*ity 44

我知道这是一个老问题,但这是我的想法:

我个人喜欢Ninject.我喜欢流畅的界面和避免使用XML.我一般都喜欢XML,只是不喜欢这种配置.特别是在涉及重构时,流畅的界面使其更容易纠正.

我想念StructureMap的ObjectFactory,但有一些简单的解决方法可以将它添加到Ninject.

正如Jeffery所指出的,当你只有一个构造函数时,你不必使用[Inject]属性.

我发现我更喜欢流畅的接口,不仅因为它们避免使用XML,而且因为当我改变影响它们的东西时它们会导致编译时错误.XML配置没有,我不得不记得改变我的状态.


IML*_*viu 10

如果您使用注入构造函数而不是Unity,则Ninject会检测循环依赖项,无论注入技术如何,都会抛出极难调试的StackOverflowException.


Joh*_*ino 9

我同意Mendelt,没有"最好的"DI框架.这取决于具体情况,它们都有利有弊.认为David Hayden在DotNet Rocks上说如果你使用EntLib的其余部分并且熟悉它,那么Unity是首选.我个人使用Unity是因为我的客户喜欢它在DLL上说微软企业库(Unity)的事实,如果你得到我说的话.

我同时使用xml配置来设置接口和它们的具体实现,但是我在注入时使用代码中的属性,例如:

<type type="ILogger" mapTo="EntLibLogger">
   <lifetime type="singleton"/>
</type>
Run Code Online (Sandbox Code Playgroud)

并在代码中:

[InjectionConstructor]
public Repository([Dependency] ILogger logger)
Run Code Online (Sandbox Code Playgroud)

就个人而言,我认为这会使发生的事情变得更加清晰,但当然有人可能会争辩说,在整个应用程序中你都会提到团结.由你决定.