依赖注入是否会导致额外的内存消耗?
目前的应用程序是由其他开发人员通过依赖注入使用Unity开发的。 该应用程序是在MVC4和Entity Framework中开发的。 这个应用程序并不大,甚至没有中型应用程序。
现在,团队希望移除依赖注入,因为它消耗大量内存。
我的问题是
1)依赖注入是否真的消耗大量内存?
2)依赖注入的优点?
3)进行Unity,依赖注入的目的是什么?
4)如何从应用程序中删除此依赖注入?
谢谢
1)依赖注入是否真的消耗大量内存?
依赖注入是一种模式。 该模式本身不使用任何内存。 但是,在实现静态类时,不能创建松散耦合的代码,因此应该在运行时创建类实例。 然而,与系统的所有其他部分相比,这些消耗的内存量可以忽略不计,尤其是在ASP.NET本身会为每个请求创建大量垃圾的Web应用程序中。 在极少数情况下,您处于非常紧张的内存限制之下(这几乎不会成为ASP.NET Web应用程序),您可以构建仅包含单例的对象图。 这意味着对象只创建一次并缓存,这可以减少应用程序创建的垃圾数量为零。 因此,依赖注入本身的使用不必消耗更多的内存,差异可以忽略不计。
这并不意味着像Unity这样的工具会消耗一些内存。 我几乎从未见过这是一个问题,尽管它总是有可能滥用该工具导致内存泄漏。 我想你应该在决定删除一些可能不是问题的工具之前对应用程序进行配置。
然而,一个常见的DbContext
是实体框架的DbContext
保持活动时间过长(比单个请求更长)。 如果你这样做,你通常会遇到很多问题,比如并发错误和内存泄漏。 然而,这与依赖注入并不严格相关,因为意外地缓存DbContext
太长时间了。
2)依赖注入的优点?
这是它自己的一个整体话题。 依赖注入是关于应用SOLID原则,特别是依赖倒置原则。 依赖倒置原则是关于创建松散耦合的代码。 如果正确完成,这会增加系统的可维护性。 关于这个问题写了完整的书籍。
3)进行Unity,依赖注入的目的是什么?
Unity是使用依赖注入时使用的众多工具之一,但对于一个非常小的应用程序,甚至可以考虑在没有任何工具的情况下应用DI。 对于小型应用程序,在不使用此类工具方面有明显的优势。
但总的来说,在DI帮助您使应用程序维护的情况下,DI库(如Unity)将有助于使您的Composition Root(将所有东西连接在一起的位置)更易于维护。
4)如何从应用程序中删除此依赖注入?
我认为你和你的团队应该退后一步,认为这是一个开始学习新东西并提高你的技能的机会,而不是回到你以前的做法。 人们应用依赖倒置原则,SOLID原则和应用依赖注入是有原因的。 这是因为这些实践改进了应用程序的整体结构,并使整个系统更易于维护。
然而,理解和掌握依赖注入的概念确实需要一段时间,但IMO花费的时间是值得的。 您将提高您作为开发人员的技能,如果您决定更换工作,这会使您对公司和任何其他公司更有价值。
关于依赖注入的最有影响力的工作是Mark Seemann的着作.NET中的依赖注入。 这本书对我和其他人编写代码的方式产生了重大影响。 这本书的第二版将于2018年推出。我正在共同编写这个新版本。 我的建议是阅读其中一个版本,最好是第二个版本,因为这是一次重大升级。
我认为你需要了解什么是依赖注入,这可能会给你所有4个问题的答案。
从这个问题可以找到一个很好的答案为什么使用依赖注入?
简而言之,删除Unity不太可能解决您的内存问题。 另外,Unity(和它的同类)是控制反转(IoC)容器,而不是依赖注入。 做一个快速的谷歌,以便你可以直接得到你的术语。
依次回答每个问题:
1)依赖注入是否真的消耗大量内存?
IoC容器不消耗大量内存(如果使用得当的话),并且被许多非常大的系统使用而没有问题。 内存消耗可能是您系统中其他地方的问题。 为什么你怀疑你的IoC容器是罪魁祸首? 你有个人简介吗?
2)依赖注入的优点?
多元化 - 一个是它让你思考系统中的依赖关系,而不仅仅是将所有东西都新鲜出来......它还允许你使它更具可测试性和动态性,即你可以更容易地交换“组件”。
3)进行Unity,依赖注入的目的是什么?
这个想法是你对接口而不是具体的实现进行编程。 这使TDD(使用嘲笑等)和其他最佳实践。 这也意味着您可以更轻松地交换实现而不会破坏所有内容。
4)如何从应用程序中删除此依赖注入?
不要......你不会解决你的记忆问题,但会引入很多其他问题......如果有什么更可能增加你当前的问题。
这就是说......如果你错误地配置了Unity,并设置了一些寿命周期等等,那么你有可能以这种方式泄漏内存。 然而,将宝宝泼出去并不是前进的方向。
链接地址: http://www.djcxy.com/p/82249.html上一篇: Does Dependency Injection cause extra memory consumption?
下一篇: How do I make an object persistent in memory while application is running?