c# - 依赖注入(inject)会导致额外的内存消耗吗?

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

当前应用程序是由其他开发人员使用 Unity 通过依赖注入(inject)开发的。该应用程序是在 MVC4 和 Entity Framework 中开发的。这个应用程序不大,甚至不是中型应用程序。

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

我的问题是

  1. 依赖注入(inject)真的会消耗大量内存吗?

  2. 应用依赖注入(inject)有哪些优点?

  3. 使用 Unity 的目的是什么?

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

最佳答案

  1. Is dependency injection really consume lot of memory ?

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

但这并不意味着 DI 容器(例如 Unity)不消耗内存。但我不记得这曾经是一个问题,尽管工具的误用(或错误)总是有可能导致内存泄漏。我认为您应该在决定删除某些可能根本不是问题的工具之前分析应用程序。

但是,一个常见的陷阱是 Entity Framework 的 DbContext 保持事件状态的时间过长(比单个请求长)。如果这样做,通常会遇到许多问题,例如并发错误和内存泄漏。然而,这与依赖注入(inject)并不严格相关,即使不使用 DI,也很容易意外地将 DbContext 缓存太久。

  1. Advantages of having Dependency Injection ?

这本身就是一个完整的主题。依赖注入(inject)是关于应用SOLID principles ,尤其是Dependency Inversion Principle 。依赖倒置原则是关于创建松散耦合的代码。如果做得正确,这会提高系统的可维护性。 Complete books are written about this主题。

  1. what is the purpose of having Unity, Dependency Injection ?

Unity 只是 many DI Containers 之一您可以在练习依赖注入(inject)时使用。请注意,DI 容器不是强制性工具。您甚至可以考虑在不使用任何工具的情况下应用 DI。对于小型应用程序,甚至还有 clear advantage in not using such tool .

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

  1. How to remove this Dependency Injection from application ?

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

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

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

关于c# - 依赖注入(inject)会导致额外的内存消耗吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24781335/

相关文章:

c# - 如何确保 C# 的 Process.Start 会扩展环境变量?

c# - MEF 从网络共享文件夹加载插件

java - 当我们有多个实现类时,依赖注入(inject)有何帮助?

c# - 无法使用 Simple Injector 注册 Api Controller?

c# - OSX 上的 Mono,Process.Start 有时会抛出无法处理的 native 包装器异常

c# - 如何避免 View 模型的冗余属性

c# - MVC 在后 ActionResult 中获取表单控件数据属性值

jquery - 如何根据模型值显示 css div?

asp.net-mvc-4 - 简单成员资格 :Last Login date of User

.net - 洋葱架构中的依赖解析