Ninject vs Unity for DI
我们正在使用ASP.net MVC。
哪个是最好的DI框架Ninject或Unity,为什么?
上次我看着他们中的任何一个,我发现Ninject稍微好一些。 但两者都有其缺点。
Ninject有更好的stream畅configurationscheme。 Unity似乎主要依赖XMLconfiguration。 Ninject的主要缺点是它需要您在代码中的任何地方引用Ninject.Core来添加[Inject]属性。
如果我可能会问,为什么要限制你的select呢? 我认为Castle.Windsor,Autofac和StructureMap至less是一样好或者更好。
我知道这是一个古老的问题,但这是我的想法:
我个人喜欢Ninject。 我喜欢stream畅的接口和避免XML。 我一般喜欢XML,而不是这种configuration的东西。 特别是当涉及重构时,stream畅的界面使得更容易纠正。
我错过了StructureMap的ObjectFactory,但是有一些简单的解决方法可以将它添加到Ninject中。
正如Jeffery所指出的,当你只有一个构造函数时,你不必使用[Inject]属性。
我发现我更喜欢stream畅的接口,不仅仅是因为它们避免了XML,而是因为当我改变一些影响它们的东西时,它们会导致编译时错误。 XMLconfiguration没有,我不得不记得要改变我的好处。
Ninject检测循环依赖关系,如果您使用注入构造函数,而不是Unity,无论注入技术只是抛出一个非常难以debugging的StackOverflowException。
我同意Mendelt,没有“最好”的DI框架。 这只取决于情况,他们都有利有弊。 David Hayden认为在DotNet Rocks上,如果你使用EntLib的其余部分并且熟悉Unity,那么Unity是首选。 我个人使用Unity是因为我的客户喜欢这个事实,即它说的DLL上的Microsoft企业库(Unity),如果你明白我的意思。
我同时使用xmlconfiguration来设置接口和它们的具体实现,但是在注入时使用代码中的属性,如:
<type type="ILogger" mapTo="EntLibLogger"> <lifetime type="singleton"/> </type>
并在代码中:
[InjectionConstructor] public Repository([Dependency] ILogger logger)
就我个人而言,我认为这会使发生的事情变得更加清楚,但是当然可以争辩说,在整个申请过程中,你会提到统一性。 随你便。