构造器注入:有多less依赖关系太多?

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

我有一个课,取决于一堆小物体 – 有时在6到10之间的任何地方。 随着我继续把我的申请分成小块,我可以看到这个数字随着时间的推移而增加。 这是个常见的问题吗?

显然这将取决于项目的很多。 但是,基本的问题是这样的:

你什么时候开始对某个class级的依赖数量感到不舒服? 什么是你用来减less这些依赖的一些策略?

这可能是一个标志,具有6-10依赖性的类本身需要被重构。

我不会为此担心的。

相反,我担心class级太复杂。

一个有许多依赖关系的类,它们都使用它们,但是没有循环或者语句没有问题。 在最近的一些代码中,在一个类中有大约14个依赖关系。 但是,通过代码只有一条path,没有合理的方式将依赖关系分组为更好的类。

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

我想不会超过三四个。 如果你得到的不仅仅是这些,我会开始考虑你是如何抽象你的担忧的 。 例如,一个存储库对象应该满足相关类中的所有数据检索需求。

Runcible,

这里是温莎城堡项目的链接。 这是一个控制容器的反转 。 这些容器允许工厂类收集你的依赖关系,并将它们作为一个单一的对象注入到你的构造函数中。

http://www.castleproject.org/container/index.html

我听说过有关温莎的好消息。 Spring也是一个IoC容器, 还有其他的 。

一个具有6-10依赖关系的类是一种代码味道。 这清楚地表明,这个阶级是违反单一责任原则的 。

什么是你用来减less这些依赖的一些策略?

Mark Seemann在他的“ 重构整合服务”(Refactoring to Aggregate Services)以及他在.NET中的dependency injection(Dependency Injection)一书中已经明确了这个任务。 你们class有这么多依赖的事实表明class上有不止一个责任。 通常情况下,一个隐含的领域概念等待通过识别它并将其变为自己的服务来显式化 。 一般来说,大多数类不应该超过4-5依赖。

你也可能想看看你的构造函数中的任何参数是否应该被合并到一个类中(假设这个参数对于类来说是有意义的)。

这也可能是你想看看使用ServiceLocator模式的一些依赖。 如果您不得不将相关性传递给一长串构造函数,那么尤其如此。