Dependency injection 我应该在哪里存储对DI容器的引用?

Dependency injection 我应该在哪里存储对DI容器的引用?,dependency-injection,inversion-of-control,castle-windsor,structuremap,unity-container,Dependency Injection,Inversion Of Control,Castle Windsor,Structuremap,Unity Container,我想知道应该如何存储/引用依赖项注入容器。让容器成为静态类上的静态属性可以吗?还是应该让容器成为应用程序上的实例变量?我想知道每个选项的优缺点是什么,在web、mvc、console和windows应用程序中的最佳做法是什么?我建议将其作为实例变量存储在应用程序中。使用静态属性—使其成为全局可访问的单例—隐藏应用程序对它的依赖性,这是您首先尝试使用依赖项注入容器来避免的事情之一 话虽如此,如果您的框架使您难以访问应用程序实例,那么使用静态变量并不是世界末日。我同意斯特纳尔先生的看法。需要考虑的是

我想知道应该如何存储/引用依赖项注入容器。让容器成为静态类上的静态属性可以吗?还是应该让容器成为应用程序上的实例变量?我想知道每个选项的优缺点是什么,在web、mvc、console和windows应用程序中的最佳做法是什么?

我建议将其作为实例变量存储在应用程序中。使用静态属性—使其成为全局可访问的单例—隐藏应用程序对它的依赖性,这是您首先尝试使用依赖项注入容器来避免的事情之一


话虽如此,如果您的框架使您难以访问应用程序实例,那么使用静态变量并不是世界末日。

我同意斯特纳尔先生的看法。需要考虑的是一些DI容器实现IDISPISPOLIDE,所以您可能希望在正常程序终止时处理容器。看

还请注意,通常最好避免在整个应用程序中分散依赖于DI容器。换句话说,尽量避免使容器全局可用(Singleton、static属性,甚至是injected)以用作一个容器


相反,您可以使用容器的功能来解析依赖项的依赖项。例如,您可以在应用程序启动时创建容器,并使用它构建模型(在MVC中)。模型可能依赖于存储库和web服务。存储库可能依赖于记录器。构建模型时,容器将解决所有这些问题。如果您的模型需要动态创建依赖项实例,请向其中注入工厂。

duplicate:谢谢大家!对不起所有的复制品-我想这是一个dup,但不确定如何表达我的问题来找到它们。同意,我喜欢一张海报将它放在Mauricio挖出来的其中一个dup中:“将IOC容器放在过程中的最高级别/入口点,并使用它在其下的所有东西中注入依赖项。”()@Jeff-引用得不错;简明扼要。Thorsten Lorenz在这个链接中也给出了一个很好的答案(同样来自Mauricio):如果您将容器放在最高级别,这可能需要保存对需要注入(可能是数据访问)的最低级别程序集的引用。这让我有点恼火:(