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

Dependency injection 构造函数注入:有多少依赖项太多?,dependency-injection,Dependency Injection,我已经使用手动构造函数注入DI有一段时间了。我注意到的一件事是,我的构造函数开始变长 我有一个类,它依赖于一堆小对象——有时介于6到10之间。当我继续将我的应用程序分成更小的块时,我可以看到这个数字随着时间的推移而增加。这是一个普遍的问题吗 显然,这将在很大程度上取决于该项目。然而,基本问题是: 你什么时候开始对一个类拥有的依赖项的数量感到不舒服?您使用了哪些策略来减少这些依赖项?这可能是一个迹象,表明具有6-10个依赖项的类本身需要重构。我认为最多只能重构三个或四个。如果你得到的不止这些,我会

我已经使用手动构造函数注入DI有一段时间了。我注意到的一件事是,我的构造函数开始变长

我有一个类,它依赖于一堆小对象——有时介于6到10之间。当我继续将我的应用程序分成更小的块时,我可以看到这个数字随着时间的推移而增加。这是一个普遍的问题吗

显然,这将在很大程度上取决于该项目。然而,基本问题是:


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

这可能是一个迹象,表明具有6-10个依赖项的类本身需要重构。

我认为最多只能重构三个或四个。如果你得到的不止这些,我会开始思考你在抽象你的想法方面做得有多好。例如,单个对象应该满足所讨论的类中的所有数据检索需求。

您可能还需要查看构造函数的任何参数是否也应该组合到单个类中(假设这些参数作为一个类是有意义的)

您可能还想考虑对某些依赖项使用ServiceLocator模式。如果必须将依赖项传递给一长串构造函数,这一点尤其正确。

Runcible

这里是温莎城堡项目的链接。它是一个容器。这些容器允许工厂类将依赖项收集在一起,并将它们作为单个对象注入构造函数


我听说了温莎的好消息。还制作了一个IoC容器,而且。

我不会为此担心

相反,我会担心这个类太复杂

具有许多依赖项的类,这些依赖项都使用,但没有循环,或者if语句很好。在我最近编写的一些代码中,一个类中大约有14个依赖项。但是,代码中只有一条路径,没有逻辑方法将依赖项分组到更好的类中


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

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

您使用哪些策略来减少这些依赖关系


马克·西曼(MarkSeemann)在他的文章中以及在他的书中都明确了这一任务。您的类具有如此多的依赖项这一事实表明,类中有多个职责。通常,有一个隐式的域概念等待着通过识别它并将其转换为自己的服务而变得明确。一般来说,大多数类不应该需要超过4-5个依赖项。

服务定位器模式有点与依赖项注入原则相反。服务定位器违反了德米特定律:非常好的视频,可运行。对DI、IOC和服务定位器的解释非常容易理解。假设一个对象需要访问数据库和某种方式进行外部通信(例如,存储库和IO),那么在分配的4个依赖项中已经有2个依赖项了。此外,确保每个班级都有一个单一的责任(单一的关注点)的副作用之一不是会导致更多的班级而不是更少的班级吗?最终,需要有一个类来协调所有这些较小的部分…并且该类将有许多依赖项才能运行。@Runcible,非常正确。如果您描述的整合发生了,您将确实有更少的东西注入构造函数。顺便说一句,您所描述的是一个控制反转容器(例如Windsor)。@Runcible,我最近一直在努力解决依赖于注入的问题。我发现了两篇非常有用的帖子另一个注意事项是,我相信SRP的目的不是让一个类做一件事,而是从业务的角度来看,有一个改变的理由。如果您无法找到逻辑方法将它们分组到多个类(如WW)中该怎么办。提到?你同意有很多依赖关系是可以的吗?我的意思是,我们可以说依赖于汽车品牌:宝马、欧宝、大众等等。它们都是汽车。也许不是最好的例子,但我希望你能理解。@Darius.V-如果你有一个
汽车
类,它有50个品牌依赖项,那么你显然违反了SRP。您需要将它们分组为共同特征(即
电动汽车
混合动力汽车
柴油汽车
汽油汽车
),因此您的顶级
汽车
类只有几个具有共同属性和方法的依赖项。在下面,您可以使用将多个类似的汽车简化为一个依赖项(例如,只需将一个
GasolineCarsStrategy
注入到您管理所有汽油汽车的cars类中即可).关于SRP:假设您有一个API控制器,它有10个HttpGet方法和10个依赖项——每个方法一个用来处理逻辑。每种方法都与控制器相关,但它们都从不同的来源请求数据,因此它们需要自己的处理。所有10个依赖项都使用相同的通用接口,但具有不同的模型。控制器中不执行任何逻辑。在这种情况下,我仍然认为这个控制器是可靠的,不管有多少依赖性。