105

我们正在使用 ASP.net MVC。

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

4

5 回答 5

47

上次我查看它们中的任何一个时,我发现 Ninject 稍微好一点。但两者都有其缺点。

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

如果我可能会问,您为什么将选择限制在这两个上?我认为 Castle.Windsor、Autofac 和 StructureMap 至少一样好或更好。

于 2009-06-28T12:18:01.817 回答
47

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

我个人喜欢Ninject。我喜欢流畅的界面并避免使用 XML。我通常喜欢 XML,只是不喜欢这种配置的东西。尤其是在涉及重构时,流畅的接口使其更容易纠正。

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

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

我发现我更喜欢流畅的接口,不仅因为它们避免了 XML,而且因为当我更改影响它们的某些内容时它们会导致编译时错误。XML 配置不会,而且我必须记住的更改越少,我的情况就越好。

于 2010-03-05T15:02:58.300 回答
10

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

于 2013-05-16T17:14:50.133 回答
9

我同意 Mendelt 的观点,没有“最好的”DI 框架。这取决于情况,它们都有优点和缺点。想想 David Hayden 在 DotNet Rocks 上说过,如果您使用 EntLib 的其余部分并且熟悉 Unity,那么 Unity 是首选。我个人使用 Unity 是因为我的客户喜欢它在 DLL 上显示Microsoft Enterprise Library (Unity)的事实,如果你明白我的意思的话。

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

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

在代码中:

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

就我个人而言,我认为这可以更清楚地说明发生了什么,但当然有人可能会争辩说,您将在整个应用程序中引用统一。由你决定。

于 2009-07-01T10:50:31.740 回答
7

http://www.palmmedia.de/blog/2011/8/30/ioc-container-benchmark-performance-comparison

Unity 更快,但不是最好的

于 2013-04-16T18:31:30.937 回答