针对DI的Ninject vs Unity

时间:2009-06-28 12:08:55

标签: asp.net-mvc ninject unity-container

我们正在使用ASP.net MVC。

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

5 个答案:

答案 0 :(得分:45)

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

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

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

答案 1 :(得分:45)

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

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

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

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

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

答案 2 :(得分:10)

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

答案 3 :(得分:9)

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

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

<type type="ILogger" mapTo="EntLibLogger">
   <lifetime type="singleton"/>
</type>

并在代码中:

[InjectionConstructor]
public Repository([Dependency] ILogger logger)

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

答案 4 :(得分:7)