为什么在Simple Injector中将构造函数中的GetInstance()调用为次优?

时间:2014-08-14 09:29:53

标签: c# dependency-injection ioc-container simple-injector

来自Simple Injector文档中的Using the Simple Injector

  

注意:在构造函数中调用GetInstance方法是次优的,应尽可能避免使用。但是,使用ASP.NET Web Forms,很难完全避免这种情况。有关替代方案,请参阅“集成指南”。

为什么它不是最理想的?

我确实注意到这种用法可能会导致the container is locked after the first call to resolve的故意限制。因此,如果您注册A,然后创建一个ISomething集合 - 其中一个依赖于A - 然后您使用RegisterAll()注册该集合,然后您遇到麻烦,因为其中一个ISomethings解析A,阻止随后注册该集合。

然而,我想还有更多的东西"次优的"比这个。

1 个答案:

答案 0 :(得分:2)

从你的类型的构造函数中回调容器是sub可选的,因为:

  • 您的DI库是盲目的,并且不允许它查看某个类型具有哪些依赖项,这使得您无法warn you about any misconfigurations这样做。
  • 使DI库无法为您优化对象图构造。
  • 通过在编译代码之前更改表达式树,无法应用Context Based Injection之类的功能。
  • 您将调用容器的单元测试代码变得更难。

回调容器是anti-pattern called Service Locator

不幸的是,你指出的文档有点过时,一般来说我们建议不要使用这种类型的构造。因此,ASP.NET Web Forms Integration page使用显式属性注入描述了更好的解决方案。