依赖注入会导致额外的内存消耗吗?

时间:2014-07-16 12:53:51

标签: c# asp.net-mvc-4 dependency-injection unity-container

当前的应用程序是由其他开发人员使用Unity的Dependency Injection开发的。该应用程序是在MVC4和实体框架中开发的。这个应用程序并不大,甚至不是中型应用程序。

现在,团队希望删除依赖注入,因为它消耗了大量内存。

我的问题是

1)依赖注入真的会占用大量内存吗?

2)具有依赖注入的优势?

3)拥有Unity,依赖注入的目的是什么?

4)如何从应用程序中删除此依赖注入?

由于

4 个答案:

答案 0 :(得分:6)

  

1)依赖注入真的会占用大量内存吗?

依赖注入是一种模式。模式本身不使用任何内存。但是,在实现静态类时,您无法创建松散耦合的代码,因此在运行时类实例应该创建。然而,与系统的所有其他部分相比,这种消耗的内存量可以忽略不计,特别是在ASP.NET本身为每个请求创建大量垃圾的Web应用程序中。在非常罕见的情况下,您处于非常严格的内存限制(几乎不会是ASP.NET Web应用程序),您可以构建仅由单例组成的对象图。这意味着对象只创建一次并缓存,这可以减少应用程序创建的垃圾量为零。因此,依赖注入本身的使用不必消耗更多内存,差别可以忽略不计。

这并不意味着像Unity这样的工具会占用一些内存。我几乎没有见过这是一个问题,虽然它总是可能误用工具导致内存泄漏。我认为您应该在决定删除一些可能根本不存在问题的工具之前对应用程序进行概要分析。

然而,一个常见的陷阱是实体框架的DbContext保持活得太久(比单个请求更长)。如果你这样做,你通常会遇到很多问题,比如并发错误和内存泄漏。然而,这与依赖注入并不严格相关,很容易意外地将DbContext缓存太长时间。

  

2)具有依赖注入的优势?

这是它自己的一个完整主题。依赖注入是关于应用SOLID principles,尤其是Dependency Inversion Principle。依赖性倒置原则是关于创建松散耦合的代码。如果操作正确,则可以提高系统的可维护性。 Complete books are writen about this主题。

  

3)拥有Unity,依赖注入的目的是什么?

Unity只是使用依赖注入时使用的many tools之一,但对于一个非常小的应用程序,您甚至可以考虑在没有任何工具的情况下应用DI。对于小型应用程序,有一个clear advantage in not using such tool

但总的来说,DI作为一种模式 - 有助于使您的应用程序可维护,DI库(如Unity)将有助于使您的Composition Root(将所有连接在一起的地方)更易于维护

  

4)如何从应用程序中删除此依赖注入?

我认为您和您的团队应该退后一步,将其视为一个开始学习新知识并提高技能的机会,而不是恢复原来的做法。人们有理由应用依赖倒置原则,SOLID原则并应用依赖注入。这是因为这些实践改善了应用程序的整体结构,使整个系统更易于维护。

然而,确实需要一些时间来理解和掌握依赖注入的概念,但IMO值得花时间。作为开发人员,您将提高自己的技能,如果您决定转换工作,这将使您对公司和任何其他公司更有价值。

关于依赖注入主题的最有影响力的工作是Mark Seemann's本书Dependency Injection in .NET。那本书对我和其他许多人编写代码的方式产生了重大影响。这本书的second edition将于2018年出版。我正在共同创作这一新版本。我的建议是阅读其中一个版本,最好是第二版,因为它是major upgrade

答案 1 :(得分:0)

我认为你需要先了解依赖注入是什么,这可能会给你所有4个问题的答案。

问题here

可以找到一个好的答案Why does one use dependency injection?

答案 2 :(得分:0)

简而言之,删除Unity不太可能解决您的内存问题。此外,Unity(及其类似)是控制反转(IoC)容器,而不是依赖注入。做一个快速的谷歌,这样你就可以直截了当地学习。

依次回答每个问题:

1)依赖注入真的消耗了大量内存吗?

IoC容器不占用大量内存(如果使用得当),并且被许多非常大的系统使用而没有问题。内存消耗可能是系统中其他地方的问题。为什么你怀疑你的IoC容器是罪魁祸首?你介绍过吗?

2)具有依赖注入的优势?

Mutliple - 一个是它让你考虑系统中的依赖关系,而不仅仅是新建一切...它还允许你使它更可测试和动态,即你可以交换"组件&#34 ;更容易。

3)拥有Unity,依赖注入的目的是什么?

这个想法是你针对接口而不是具体的实现进行编程。这使得TDD(使用模拟等)和其他最佳实践成为可能。这也意味着您可以更轻松地交换实现而不会破坏所有内容。

4)如何从应用程序中删除此依赖注入?

不要......你不会解决你的记忆问题,但会引入很多其他问题......如果有的话,你更有可能加剧你当前的问题。

那说...如果你配置错误的Unity并设置了一些生存时间等等,那么你可能会以这种方式泄漏内存。然而,将婴儿扔出洗澡水并不是前进的方法。

答案 3 :(得分:0)

1)依赖注入真的消耗了大量内存吗?

不,使用DI与Uni​​ty可以控制对象的生命周期,您可以决定何时放置对象,也可以采用单例设计模式。

2)具有依赖注入的优势?

使用DI可以更好地帮助您的应用程序:提高可维护性,可测试性,灵活性,可扩展性,后期绑定,并行编程。它还涉及SOLID原则。

3)拥有Unity,依赖注入的目的是什么?

使用松散耦合设计删除应用程序中的紧耦合依赖项。

4)如何从应用程序中删除此依赖注入?

删除Unity参考。删除所有注册方法。

有关详细信息,请查看此链接Patterns and practices