我应该在哪里做注射用Ninject 2+(和我怎么安排我的模块?)(Where should I d

2019-07-19 14:06发布

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

  1. 类库与其他几个项目中使用的功能。
  2. ASP.NET MVC应用程序。

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

  • 该类库需要一些迪爱生,其中在需要web请求特定的会话对象(认为工作单位)的库类其他的事情。
  • 该MVC应用程序需要DI自从与Ninject 2,你基本上从NinjectHttpApplication继承。
  • 对于类库单元测试需要意识到这一点注入一组不同的存储库。
  • 对于Web应用程序的单元测试需要注入出于同样的原因。

我自己画成一个精神角落在这里,因为我只看到三个选项开始。 DI类库中,DI在Web应用程序,或两者兼而有之,但也有每个问题:

  • 因为MVC应用程序需要从NinjectHttpApplication继承开始与我不仅可以在类库做DI。
  • 我不仅可以在MVC应用程序做DI - 类库被其他库使用,毕竟,和MVC应用程序不应该知道太多关于图书馆的内部反正。
  • 我想这是出于我能看到的唯一途径:独立的IoC为这两个项目。 类库和MVC应用程序都有自己的IoC设置和做DI为自己的东西,而真正关心彼此。

有没有人对如何做这样的事情有些“最佳实践”或准则? 我无法想象我在这种情况下,结束了第一个人,那就一定是很高兴知道什么是“正确”的方式做,这是...

谢谢!

Answer 1:

我不知道NInject,但除非它比温莎千差万别,StructureMap等答案倾向于保持不变,因为有一些共同的DI模式。 考虑到这一点:

要认识到的第一件事是,DI是不依赖于诸如NInject或温莎特定的框架。 这是一组技术和设计模式遵循。 你可以使用所谓的穷人的DI DI手动,但显然它得到了DI容器要好得多。

这是为什么有关? 这是相关的,因为一旦你意识到这一点,必然结果是,绝大多数的应用程序代码应该没有了DI容器的知识保证责任。

所以,你在哪里使用DI容器? 它应该只在成分根 ,而你的情况将对应于Global.asax中使用。 你可以阅读更多关于这一点这个苏答案 -尽管这问题是关于温莎,原理是一样的。

如何单元测试呢? 他们应该是完全无知的DI容器为好。 见这等SO回答更多的细节。

DI可以在图书馆用大量使用构造器注入来实现。 你不需要引用任何DI容器要做到这一点,但如果你使用一个DI容器,以解决从构成根所有依赖它使生活变得更加简单。



文章来源: Where should I do Injection with Ninject 2+ (and how do I arrange my Modules?)