c# - ASP.NET 5 控制器构造函数中过多的依赖注入服务会影响性能和内存吗?
问题描述
假设我有一个控制器 ( UserController
),其中包含大约 10 个操作 ( ListUser, GetUserDetail, SearchUser,...
)。每个动作都将使用一个特定的服务(其中之一IUserListService, IUserDetailService, IUserSearchService,...
)。它们是从控制器构造函数注入的依赖注入服务。
问题是,每次我的应用程序接收到一个请求(例如/User/ListUser
),执行都会通过控制器构造函数并且必须连接所有相关的服务。我认为这对内存和性能无效,因为它还会连接不必要的服务,而不是只连接需要的服务:IUserListService
.
- 我不确定我的假设是否正确?
- 如果这是真的,有什么有效的方法可以解决吗?
先感谢您。
解决方案
除非在这些注入依赖项的构造函数中发生昂贵的事情,否则这些依赖项的性能影响是微不足道的。一个原因是在完成请求的过程中需要各种代码。这包括中间件和各种其他东西。构建这些类并不是其中的重要部分。
也许其中一些依赖项被注册为单例,因此它们甚至没有为每个请求构建。
我并不是说性能和内存使用绝对不是问题(因为我不知道),但这不太可能。但是构建但从未使用过的类并不是什么大问题。如果存在性能/内存问题,它们将出现在执行的方法中。
话虽如此,无论如何还是值得拆分这些控制器。如果一个类有十个注入依赖项和十个方法,每个方法都使用不同的依赖项,那么它就不是内聚的。这十种方法都在做完全不同的事情,为什么它们都在一个类中?
类很大,可能难以维护。控制器有单元测试吗?我敢打赌他们在一个以十个模拟开始的班级。这些测试很难阅读和维护。结果是开发人员将花费更多时间阅读类和测试,更改将花费更长的时间,并且可能导致需要时间修复的缺陷。
我会编一些数字来说明问题。这些可能甚至不接近真实。
但是假设构建控制器需要 3 毫秒,而减少这些依赖意味着它需要 2 毫秒,所以你节省了 1 毫秒。乘以一百万个请求,您已经节省了 17 分钟的处理时间,这些时间分布在这些不明显的百万个请求中。从这个角度来看,这可能并不重要。
另一方面(仍在弥补)拆分控制器可能会花费一到两个小时,然后防止花费两倍于阅读它的额外时间,增加维护它的时间,额外的时间来修复缺陷,以及这些成本的巨大成本缺陷。这是分手的更好理由。
推荐阅读
- javascript - 将隐藏文本数组中的项目显示给按钮数组中的相应按钮
- azure - ARM 模板 - 不允许在主模板中使用多个链接模板
- neo4j - Neo4j - Cypher 自反关系查询
- python - 使用 Dask 或 Joblib 构建并行 Sklearn 模型
- reactjs - 使用 apollo 客户端设置初始状态
- python - 使用正则表达式时出错。断言错误:得到
, 预期的 ` - javascript - 数组的属性如何
- java - 使用 FTP 将 Spring Boot app.jar 部署到 Azure 不起作用
- c# - 如何根据另一个属性从 json 列表中获取属性?
- django - 如何将 django 中的查询集转换为 json