构造函数注入:有多少依赖项太多了?

Run*_*ble 48 dependency-injection

我现在一直在使用手动构造函数注入DI.我注意到的一件事是我的构造函数开始变得相当长.

我有一个类依赖于一堆小物体 - 有时候在6到10之间.随着我继续将我的应用程序分解为更小的块,我可以看到这个数字随着时间的推移而增加.这是个常见的问题吗?

显然,这将取决于该项目.但是,基本问题是:

你什么时候开始对一个类的依赖数量感到不舒服?您使用哪些策略来减少这些依赖性?

Jac*_*b B 15

这可能表明具有6-10个依赖关系的类本身需要重构.

  • 如果你找不到合理的方法将它们分为多个类(例如 WW)怎么办?提及?你同意有很多依赖关系就可以吗?我的意思是,假设依赖项是汽车品牌:宝马、欧宝、大众等。它们都是汽车。也许不是最好的例子,但我希望你能明白。 (2认同)
  • @Darius.V - 如果您有一个具有 50 个品牌依赖项的“汽车”类,那么显然您违反了 SRP。您需要将它们分组为共同特征(即`ElectricCars`、`HybridCars`、`DieselCars`、`GasolineCars`),因此顶级`Cars` 类只有几个依赖项,每个类都具有共同的属性和方法。在此之下,您可以使用 [strategy pattern](/sf/answers/2238018401/) 将多个类似的汽车简化为一个依赖项(例如,只需将一个 `GasolineCarsStrategy` 注入到您的汽车中管理所有汽油车的类)。 (2认同)

WW.*_*WW. 12

我不担心.

相反,我担心课程太复杂了.

一个具有许多依赖项的类,它们使用它们但没有循环或if语句很好.在我最近工作的一些代码中,一个类中有大约14个依赖项.但是,只有一条路径通过代码,没有逻辑方法将依赖项分组到更好的类中.

应简化包含许多分支语句或复杂循环条件的具有少量依赖关系的类.


Rob*_*vey 5

我认为不会超过三四个.如果你得到的不止这些,我会开始思考你是如何抽象出你的担忧的.例如,单个存储库对象应该满足相关类中的所有数据检索需求.

  • 据推测,如果一个对象需要访问数据库以及某种外部通信方式(例如,Repository和IO),那么已经分配了4个依赖关系.除此之外 - 不是确保每个类的副作用之一有一个单一的责任(单一关注)会导致更多的课程而不是更少的课程吗?最终,需要一个可以编排所有这些较小部分的类......并且该类将具有许多依赖性以便起作用. (3认同)
  • @Runcible,我最近一直在努力解决这个依赖于注入的问题。我发现了两个非常有用的帖子。http://blog.ploeh.dk/2010/01/20/RebuttalConstructorover-injectionanti-pattern/ & http://blog.ploeh.dk/2010/02/02/RefactoringtoAggregateServices/ 另一个注意事项,我相信SRP 不是让一个类做一件事,而是有一个从业务角度改变的理由。 (2认同)

Nig*_*888 5

具有 6-10 个依赖项的类是一种代码味道。这表明该类可能违反了单一职责原则

您使用哪些策略来减少这些依赖性?

Mark Seemann 在他的《重构聚合服务》一文以及他的《.NET 中的依赖注入》一书中明确了这一任务。您的类具有如此多的依赖项这一事实表明该类中存在多个职责。通常有一个隐含的领域概念等待通过识别它并将其纳入自己的服务来使其显式化。一般来说,大多数类永远不会需要超过 4-5 个依赖项。

  • 关于 SRP:假设您有一个 API 控制器,具有 10 个 HttpGet 方法和 10 个依赖项——一个用于处理每个方法的逻辑。每个方法都与控制器相关,但它们各自从不同的源请求数据,因此它们需要自己的处理。所有 10 个依赖项都使用相同的通用接口,但具有不同的模型。控制器中不执行任何逻辑。在这种情况下,我仍然会认为这个控制器是可靠的,尽管有很多依赖项。 (6认同)