我在想我应该如何存储/引用我的依赖注入容器。让一个容器成为静态类的静态属性是否正常?或者我应该让容器成为应用程序中的实例变量?我想知道每个选项的优缺点,以及web,mvc,控制台和Windows应用程序中的最佳做法是什么?我应该在哪里存储对我的DI容器的引用?
回答
我建议将它作为实例变量存储在应用程序中。使用一个静态属性 - 使它成为一个全局可访问的单例 - 隐藏了你的应用程序对它的依赖,这是你首先使用依赖注入容器试图摆脱的事情之一!尽管如此,如果你的框架让你很难访问你的应用程序实例,那么使用静态变量将不会是世界末日。
我同意Sternal先生对此的看法。有一点需要考虑的是有些DI容器实现了IDisposable,所以你可能想要在正常程序终止时处理容器。请参阅How do you reconcile IDisposable and IoC?
另请注意,通常最好避免整个应用程序中DI容器的散射依赖性。换句话说,尽量避免将容器全局可用(单例,静态属性,甚至注入)作为Service Locator使用。
相反,您可以使用容器的能力来解决依赖关系的依赖关系。例如,您可以在应用程序启动时创建容器并使用它来构建您的模型(在MVC中)。该模型可能取决于存储库和Web服务。存储库可能依赖于记录器。容器将在模型构建时解决所有这些问题。如果您的模型需要即时创建依赖关系的实例,请将工厂注入其中。
同意,并且我喜欢一个海报如何将它放入Mauricio挖掘出的一个骗局中:“将IOC容器放在流程中的最高级别/入口点,并使用它来为它下面的所有内容注入依赖关系。” (http://stackoverflow.com/questions/480286/best-practices-for-ioc-container) – 2009-11-17 02:52:58
@Jeff - 尼斯报价;简单而重要。 Thorsten Lorenz在这个链接里也有一个很好的答案(也来自Mauricio): http://stackoverflow.com/questions/480286/best-practices-for-ioc-container – TrueWill 2009-11-17 03:03:50
如果你把容器放在最高层,这可能会创建一个需要引用最低级别的需要注入的程序集(也许是数据访问)。这让我有点困惑 – dougajmcdonald 2013-03-15 09:42:20
- 1. 我应该在哪里存储公钥?
- 2. 我应该在哪里存储“MemberID”?
- 3. 我应该在哪里存储len(list)?
- 4. 我应该在哪里存储我的javascript程序的设置?
- 5. 我应该在哪里存储我的游戏关卡状态?
- 6. FourSquare:我应该在哪里存储我的客户机密?
- 7. 我应该在哪里填充我的Zend_Navigation容器?
- 8. 我应该在哪里存储我的应用程序的“激活”密钥?
- 9. 我应该在哪里存储我的ASP.NET应用程序的版本信息?
- 10. 我应该在哪里存储我的iPhone应用程序的SQLite数据库?
- 11. 我应该在哪里存储我的网络应用程序的文件?
- 12. 我应该在哪里存储浏览器指纹?
- 13. 我应该在哪里存储backbone.js的模板?
- 14. 我的Azure云服务存储文件应该放在哪里?
- 15. 我应该在哪里存储html元素的jQuery数据?
- 16. 我应该在哪里把我的UpdatePanel
- 17. 我应该在哪里存储停用词表?
- 18. 我应该在哪里保存数据?
- 19. 哪里(层)应该使用DI?
- 20. 我的DI错误在哪里?
- 21. 我应该在哪里存储CSS文件在SharePoint安装?
- 22. Mac OS X:我应该在哪里存储常用的应用程序数据?
- 23. 我应该在哪里存储我的cocos2d Iphone游戏的gold/exp属性?
- 24. 我应该在哪里存储引用的DLL二进制文件在我的Visual Studio解决方案中
- 25. 我应该在哪里存储错误日志?
- 26. FMDataBase - 我应该在哪里存储数据库文件?
- 27. 我应该在哪里存储SSIS数据?
- 28. PHP:我应该在哪里存储信息和警告信息
- 29. Ruby on Rails:我应该在哪里存储模块?
- 30. 我应该在哪里存储全局数据库实例?
重复: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
谢谢大家!对不起所有的重复 - 我认为这是一个重复,但不知道如何说我的问题找到他们。 – 2009-11-17 03:10:03