我应该在哪里使用Ninject 2+进行注射(以及如何安排模块?)

我有两个相关的(对这个问题)项目和其他几个项目的解决方案;

  • 具有多个其他项目使用的功能的类库。
  • ASP.NET MVC应用程序。
  • 我的问题基本上是我应该在哪里与Ninject 2进行IoC,考虑...

  • 类库需要一些DI爱,以及需要Web请求特定会话对象的知识库类(请参阅工作单元)。
  • MVC应用程序需要DI,因为Ninject 2基本上是从NinjectHttpApplication继承的。
  • 对类库的单元测试需要注意这一点以注入一组不同的存储库。
  • 出于同样的原因,Web应用程序的单元测试需要注入。
  • 我在这里画了一个心理角落,因为我只看到了三个选项。 类库中的DI,网络应用程序中的DI,或两者都有,但每个都有问题:

  • 我只能在类库中做DI,因为MVC应用程序需要从NinjectHttpApplication开始继承。
  • 我只能在MVC应用程序中执行DI操作 - 毕竟,其他库使用类库,而MVC应用程序无论如何都不应该太了解库的内部信息。
  • 我想这是我能看到的唯一出路:两个项目的独立IoC。 类库和MVC应用程序每个都有自己的IoC设置,并且为他们的东西做DI,而没有真正关心对方。
  • 有没有人有一些“最佳实践”或指导如何做这样的事情? 我无法想象我是第一个在这种情况下结束的人,并且知道什么是“正确”的方式来做到这一点很好。

    谢谢!


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

    首先要意识到的是,DI不受特定框架(如NInject或Windsor)的束缚。 这是一套遵循的技术和设计模式。 您可以使用所谓的Poor Man's DI手动进行DI,但显然DI Container更好。

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

    那么你在哪里使用DI容器? 它应该只用于组合根 ,在你的情况下它将对应于Global.asax。 在这个SO答案中,你可以更多地了解这个问题 - 尽管这个问题是关于温莎的,但其原理仍然是一样的。

    那么你的单元测试呢? 他们应该完全不了解DI容器。 有关更多详细信息,请参阅其他SO答案。

    大量使用构造函数注入可以在您的库中实现DI。 您不需要参考任何DI容器来做到这一点,但如果使用DI容器来解析来自Composition Root的所有依赖关系,它会使生活变得更容易。

    链接地址: http://www.djcxy.com/p/77775.html

    上一篇: Where should I do Injection with Ninject 2+ (and how do I arrange my Modules?)

    下一篇: Is there a pattern for initializing objects created via a DI container