Ninject和Unity在依赖注入方面的区别

106

我们正在使用ASP.net MVC。

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


95
NInject更好,因为你可以在他们的网站上购买到酷炫的品牌磁铁。 - Ivan G.
5
这是一个更新版本的问题(非常相似),有些人可能会觉得有用:https://dev59.com/t2455IYBdhLWcg3wAvbQ。 - Jason Down
5个回答

49
上次我查看它们时,我发现Ninject稍微好一些。但是两者都有缺点。
Ninject具有更好的流畅配置方案。Unity似乎主要依赖XML配置。 Ninject的主要缺点是需要在代码中的每个地方引用Ninject.Core以添加[Inject]属性。
如果可以问一下,为什么将选择限制在这两个之间?我认为Castle.Windsor,Autofac和StructureMap至少同样好或更好。

47
只有当一个类有多个构造函数且你需要告诉Ninject使用哪一个构造函数时,才需要使用Inject属性。默认情况下,它会使用参数最多的构造函数。请注意,不要改变原文的意思。 - Jeffrey Cameron
11
同时,还存在官方的Ninject.Web.Mvc扩展。你可以将你的MvcApplication改为继承自NinjectHttpApplication,并在其中引导Kernel,然后调用RegisterAllControllersIn(Assembly.GetExecutingAssembly())方法来让其负责处理给定程序集中的所有控制器。神奇的事情发生了。 - Michael Stum
18
这个回答现在对于Ninject 2已经不太相关了。虽然在Ninject 1中这个投诉是合理的,但是Ninject 2允许你在不用在类中添加属性的情况下工作。ninject2可以在不需要修改你的类的情况下透明地运行。 - chillitom
3
同样适用于Unity,因为它似乎在当前版本(v3.0.1304.1)完全可以通过代码进行配置。 - Eric

47

我知道这是一个旧问题,但以下是我的想法:

个人喜欢Ninject。我喜欢流畅的接口和避免使用XML。一般来说,我喜欢XML,只是不喜欢用于这种配置文件。特别是当进行重构时,流畅的接口使得更容易纠正错误。

我错过了StructureMap的ObjectFactory,但有简单的解决方法可以将其添加到Ninject中。

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

我发现我喜欢流畅的接口不仅因为它们避免了XML,而且还因为当我更改影响它们的内容时,会在编译时出现错误。但XML配置不会,我需要记住要修改的内容越少,我就越省心。


10

Ninject检测到循环依赖关系,如果您使用的是注入构造函数,则与Unity不同,后者无论注入技术如何都只会抛出一个极难调试的StackOverflowException异常。


9
我同意Mendelt的观点,没有“最好”的DI框架。这取决于情况,它们都有优缺点。我记得David Hayden在DotNet Rocks上说,如果您使用其他EntLib并熟悉它,则Unity是首选。我个人使用Unity,因为我的客户喜欢DLLs上显示Microsoft Enterprise Library(Unity),如果你明白我的意思。
我同时使用XML配置来设置接口及其具体实现,但在注入时我会在代码中使用属性,例如:
<type type="ILogger" mapTo="EntLibLogger">
   <lifetime type="singleton"/>
</type>

在代码中:

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

我个人认为这样做可以更清晰地说明发生了什么,当然也有人会说你的应用程序中到处都有对Unity的引用。这取决于你。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接