首页 > 解决方案 > ASP.NET 5 控制器构造函数中过多的依赖注入服务会影响性能和内存吗?

问题描述

假设我有一个控制器 ( UserController),其中包含大约 10 个操作 ( ListUser, GetUserDetail, SearchUser,...)。每个动作都将使用一个特定的服务(其中之一IUserListService, IUserDetailService, IUserSearchService,...)。它们是从控制器构造函数注入的依赖注入服务。

问题是,每次我的应用程序接收到一个请求(例如/User/ListUser),执行都会通过控制器构造函数并且必须连接所有相关的服务。我认为这对内存和性能无效,因为它还会连接不必要的服务,而不是只连接需要的服务:IUserListService.

  1. 我不确定我的假设是否正确?
  2. 如果这是真的,有什么有效的方法可以解决吗?

先感谢您。

标签: c#asp.net-mvcasp.net-coreasp.net-core-mvcasp.net-core-5.0

解决方案


除非在这些注入依赖项的构造函数中发生昂贵的事情,否则这些依赖项的性能影响是微不足道的。一个原因是在完成请求的过程中需要各种代码。这包括中间件和各种其他东西。构建这些类并不是其中的重要部分。

也许其中一些依赖项被注册为单例,因此它们甚至没有为每个请求构建。

我并不是说性能和内存使用绝对不是问题(因为我不知道),但这不太可能。但是构建但从未使用过的类并不是什么大问题。如果存在性能/内存问题,它们将出现在执行的方法

话虽如此,无论如何还是值得拆分这些控制器。如果一个类有十个注入依赖项和十个方法,每个方法都使用不同的依赖项,那么它就不是内聚的。这十种方法都在做完全不同的事情,为什么它们都在一个类中?

类很大,可能难以维护。控制器有单元测试吗?我敢打赌他们在一个以十个模拟开始的班级。这些测试很难阅读和维护。结果是开发人员将花费更多时间阅读类和测试,更改将花费更长的时间,并且可能导致需要时间修复的缺陷。

我会编一些数字来说明问题。这些可能甚至不接近真实。

但是假设构建控制器需要 3 毫秒,而减少这些依赖意味着它需要 2 毫秒,所以你节省了 1 毫秒。乘以一百万个请求,您已经节省了 17 分钟的处理时间,这些时间分布在这些不明显的百万个请求中。从这个角度来看,这可能并不重要。

另一方面(仍在弥补)拆分控制器可能会花费一到两个小时,然后防止花费两倍于阅读它的额外时间,增加维护它的时间,额外的时间来修复缺陷,以及这些成本的巨大成本缺陷。这是分手的更好理由。


推荐阅读