9

我在想我应该如何存储/引用我的依赖注入容器。让一个容器成为静态类的静态属性是否正常?或者我应该让容器成为应用程序中的实例变量?我想知道每个选项的优缺点,以及web,mvc,控制台和Windows应用程序中的最佳做法是什么?我应该在哪里存储对我的DI容器的引用?

+0

重复:http://stackoverflow.com/questions/644747/autofac-in-web-applications-where-should-i-store-the-container-for-easy-access http://stackoverflow.com/问题/ 277438/abstracting-ioc-container-behind-a-singleton-doing-it-wrong http://stackoverflow.com/questions/480286/best-practices-for-ioc-container http://stackoverflow.com/问题/ 367178 /使用的ioc容器专用windsor http://stackoverflow.com/questions/1612682/typical-ioc-container-usage-passing-data-down-the-line – 2009-11-17 02:45:45

+1

谢谢大家!对不起所有的重复 - 我认为这是一个重复,但不知道如何说我的问题找到他们。 – 2009-11-17 03:10:03

回答

5

我建议将它作为实例变量存储在应用程序中。使用一个静态属性 - 使它成为一个全局可访问的单例 - 隐藏了你的应用程序对它的依赖,这是你首先使用依赖注入容器试图摆脱的事情之一!尽管如此,如果你的框架让你很难访问你的应用程序实例,那么使用静态变量将不会是世界末日。

1

我同意Sternal先生对此的看法。有一点需要考虑的是有些DI容器实现了IDisposable,所以你可能想要在正常程序终止时处理容器。请参阅How do you reconcile IDisposable and IoC?

另请注意,通常最好避免整个应用程序中DI容器的散射依赖性。换句话说,尽量避免将容器全局可用(单例,静态属性,甚至注入)作为Service Locator使用。

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

+1

同意,并且我喜欢一个海报如何将它放入Mauricio挖掘出的一个骗局中:“将IOC容器放在流程中的最高级别/入口点,并使用它来为它下面的所有内容注入依赖关系。” (http://stackoverflow.com/questions/480286/best-practices-for-ioc-container) – 2009-11-17 02:52:58

+0

@Jeff - 尼斯报价;简单而重要。 Thorsten Lorenz在这个链接里也有一个很好的答案(也来自Mauricio): http://stackoverflow.com/questions/480286/best-practices-for-ioc-container – TrueWill 2009-11-17 03:03:50

+0

如果你把容器放在最高层,这可能会创建一个需要引用最低级别的需要注入的程序集(也许是数据访问)。这让我有点困惑 – dougajmcdonald 2013-03-15 09:42:20

相关问题