c# - 为什么我不应该从构造函数中调用我的依赖项?

标签 c# constructor dependency-injection

长期以来,我一直认为从构造函数中调出类依赖项是一种不好的做法,但昨天无法向同事阐明原因。谁能提供不这样做的充分理由?

最佳答案

Nikola Malovic 的 4th law of IoC 有几个原因:

  • 当我们使用构造函数注入(inject)编写应用程序时,我们经常创建大量的对象图,我们希望能够 create these graphs as efficiently as possible .这是 Nikola 的原始论点。
  • 在奇怪的(不推荐的)情况下,你有循环依赖,注入(inject)的依赖可能还没有完全初始化,所以在那个时候尝试调用它们的成员可能会导致异常。此问题类似于 issue of invoking virtual members from the constructor .从概念上讲,注入(inject)的依赖项相当于虚拟成员。
  • 使用构造函数注入(inject),构造函数的职责是请求和接收依赖项。因此,根据单一职责原则 (SRP),它不应同时尝试做其他事情。有些读者可能会争辩说我在这里滥用了 SRP,但我认为我只是在更细粒度的上下文中应用了基本原则。

请注意this rule是上下文相关的:它适用于使用构造函数注入(inject)的服务。实体和值对象往往不使用 DI,因此它们的构造函数受其他规则约束。

关于c# - 为什么我不应该从构造函数中调用我的依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22258127/

相关文章:

android - Dagger Hilt 如何将类注入(inject)到 ViewModel 中

swift - 使用 Storyboard 和自定义 View Controller init

c# - 你将如何克服这个问题? Jquery + ajax + 服务器超时

c# - 用户确认删除先前版本

java - 构造函数实际上可以返回字符串吗?

c++ - 将方法作为构造函数参数传递

jdbc - Glassfish - 资源注入(inject)不起作用

c# - linq 简单的英语

C# 依赖注入(inject)副作用(两步初始化反模式)?

vb.net - 如何在对象的构造函数完成后立即触发事件?