2012-02-25 69 views
7

可能重复:
How do the major C# DI/IoC frameworks compare?如何选择DI容器?

有这么多DI容器,我觉得有点迷失。我是DI模式的新手。

我正在阅读Dependency Injection in .NET这本书,我发现DI在改善代码基础方面非常有用,使它更加松散耦合并且更具可测试性。

我现在想为我的虚拟项目引入一个DI容器,但这里有太多的选择。

我应该如何在Castle Windsor,Unity,StructureMap,Spring.NET,Autofac,Ninject,Funq,LinFu等之间进行选择?

我想一个连贯的做法是“只挑一个”并开始使用它(因为我认为它们非常容易互换,特别是在早期阶段),但我想做出更明智的决定。

+0

不管你做什么,都不要选择Funq,因为它不支持自动构造函数注入,它基本上不允许它在任何实际项目中使用,或者实际上使它不能作为真正的DI容器使用。 – Steven 2012-02-25 02:07:46

回答

5

这就像买车。你可能会喜欢丰田,但它只有2.5L发动机。你可能会喜欢法拉利,但它太红了。你可能会喜欢马自达,但你的老板不允许你驾驶它。你可能会喜欢悍马,但是你的同事会嘲笑你。将制造商与您的口味混合在一起,对于某个人或某个不同的时刻总会缺少某些东西。

我认为 - 首先,DI通常比没有DI更好。选择任何东西,你会变得更好。我会选择一些:

  • 具有良好的支持,社区(这样你就可以得到答案)
  • 背后都有一个好靠山公司(所以你没有得到,当它倒闭重写代码)
  • 感觉很好,你(这样你就不会在孩子,不太爽)前宣誓
  • 是不是该项目
  • 不仅仅是DI矫枉过正,但提供的东西的生态系统,将减少你花在你知道你可以做的任务上的时间,而不是现在 - 然后你可以专注于重要的事情
  • 被许多人使用(所以你知道很多零件也在现实生活中被测试并且错误被填充)
  • 不是5岁(例如那个文档说它支持Windows 98或其他东西)

我的2美分 - http://www.springframework.net/。我的意思是,他们的documentation contents page就像20页长...

,或者你可能需要一些更答案看一个类似的问题:

2

您可以从MVC3中的内置DependencyResolver开始。稍后,您可以轻松升级到Enterprise Library Unity DI。

Brad Wilson在How to use DI in MVC3上提到了一系列帖子。

-5

for .NET的最发达的DI容器Managed Extensibility Framework (MEF)我强烈建议使用它。 MEF在整个团队中快速,轻松和可维护,并具有完美的学习曲线。

+6

*“用于.NET的最开发的DI容器是MEF”* - 这个覆盖声明肯定不是真的 – BrokenGlass 2012-02-25 01:26:22

+0

我刚刚分享了我的经验,之前我已经使用了一堆DI解决方案。 Nevermind ... – ogggre 2012-02-25 01:28:07

+3

MEF不是DI容器。 MEF在基本实现的顶部提供即插即用配置(顾名思义它是一个可扩展性框架而不是DI) – Manas 2012-02-25 01:36:10

0

我的立场是,看看几个 - 你已经得到了很好的“.NET依赖注入”书籍(对于这个列表,我将添加Ninject,这不幸在本书中没有涉及) - 并选择其中一个你了解最好的和喜欢的语法。要开始使用高级功能并不重要,只是您开始

一旦你有一个IoC容器,替换它应该是微不足道的,因为所有的改变都将在一个地方 - 聚合根 - 并且不会遍布在你的代码库中。如果您还没有使用IoC容器,也会强制您设计依赖注入,这将对您的项目产生更大的影响。

0

我一直在使用Ninject和Unity。将Unity MVC添加到Unity时,代码会让我想起Ninject代码。

两者都很容易实现。两者都允许以配置文件为中心来替换启动器类中心。

我建议创建一个2小时的项目,并在每个ioc di框架中实现它,并根据经验决定你喜欢哪一个。但是,如果您在不查看其他功能的情况下执行此操作,则可能发现错过了某些内容。所以请看看第三方支持等优秀功能。

0

除了其他很棒的评论 - 如果你安装Unity.MVC3软件包,只要注意你必须使用HierarchicalLifetimeManager,如果你希望你的对象与每个请求一起处理。它的工作很好,但我想你会发现在大多数情况下,所有主要的都很好。

你的问题是找到一个适合你的环境的问题。有些地方允许开放源代码,有些则不会,在这种情况下,Unity会胜出。