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

时间:2009-11-17 02:06:42

标签: dependency-injection inversion-of-control castle-windsor structuremap unity-container

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

我同意Sternal先生的意见。需要考虑的一件事是某些DI容器实现了IDisposable,因此您可能希望在正常程序终止时处置容器。见How do you reconcile IDisposable and IoC?

另请注意,在整个应用程序中,最好避免散布DI容器的依赖关系。换句话说,尽量避免使容器全局可用(Singleton,静态属性,甚至注入)以用作Service Locator

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