我应该在哪里做Ninject 2+注射(以及如何安排我的模块?)

我有两个相关的(对这个问题)项目和其他一些解决scheme;

  1. 具有几个其他项目使用的function的类库。
  2. ASP.NET MVC应用程序。

我的问题基本上是我应该和Ninject 2做IoC,考虑…

  • 类库需要一些DI爱,尤其是需要Web请求特定会话对象的仓库类(请参阅工作单元)。
  • MVC应用程序需要DI,因为Ninject 2基本上是从NinjectHttpApplicationinheritance而来的。
  • 对类库的unit testing需要注意到这一点,以注入一组不同的存储库。
  • Web应用程序的unit testing需要注入的原因相同。

我在这里画了一个心理angular落,因为我只看到了三个选项。 类库中的DI,Web应用程序中的DI,或两者,但每个都有问题:

  • 只能在类库中做DI,因为MVC应用程序需要从NinjectHttpApplicationinheritance。
  • 我不能只在MVC应用程序中做DI – 毕竟,其他库使用类库,MVC应用程序不应该太了解库的内部。
  • 我想这是唯一的出路,我可以看到:两个项目的独立IoC。 类库和MVC应用程序每个都有自己的IoC设置,并为他们的东西做DI,而不是真的关心对方。

有没有人有一些“最佳做法”或指导如何做这样的事情? 我无法想象我是第一个在这种情况下结束的人,知道这个“正确的”方法是什么样子,这一定很高兴。

谢谢!

我不知道NInject,但除非它与Windsor,StructureMap等大不相同,否则答案会保持不变,因为有一些常见的DI模式。 考虑到这一点:

首先要意识到的是,DI不是绑定到一个特定的框架,如NInject或温莎。 这是一套遵循的技术和devise模式。 您可以使用所谓的“穷人的DI”手动进行DI,但显然,使用DI Container会更好。

为什么这是相关的? 这是相关的,因为一旦你意识到这一点,推论就是绝大多数应用程序的代码应该知道DI容器什么的。

那么你在哪里使用DI容器? 它应该只用于组合根 ,在你的情况下将对应于Global.asax。 你可以在这个答案中多读一点这个问题 – 尽pipe这个问题是关于温莎的,但是这个原则还是一样的。

那么你的unit testing呢? 他们应该完全不了解DI容器。 看到这个其他的答案更多的细节。

DI可以通过大量使用构造函数注入在库中实现。 您不需要参考任何DI容器来执行此操作,但是如果使用DI容器来parsing来自组合根的所有依赖关系,则使生活变得更容易。