即使 class 不拥有这些依赖项,您是否在构造函数中注入依赖项,而是在方法中使用它们?

Do you inject dependencies in the constructor even if the class does not own these dependencies, but uses them in methods?

如果 School class 依赖于 EmailSender class 你可能必须通过它的构造函数注入这个 EmailSender 和像 IMessagableIMessageSender 甚至 IEmailSender 以便将来可以换成其他东西。

为此,您需要在 School class.

中创建一个只读私有字段

但是你说 School HAS-A MessageSender 但肯定只是使用它的一些方法??

即使 class 仅使用传入对象中的众多方法之一,整个对象 仍被视为 [=26= 的依赖项].

当您更改对象的 API(方法签名)时,这一点变得很明显。通过将该对象交给 class,您实质上保证了该对象的“合同”。如果您更改该对象的 API,您可能会破坏依赖它的 classes。

这就是为什么我们经常使用接口将依赖项传递给 classes。该接口强制执行 class 与其依赖项之间的契约,并鼓励解耦,因为传入的对象必须仅符合接口的方法。

命名法 IS-AHAS-A 主要用于区分继承与组合。

任何 property/member 一个 class 声明,是一个 class 拥有的东西。

这里的Has-A是为了区别继承的Is-A

uses-a 属性 更多地与 class 内聚相关,而不是组合。如果 class 有 -A 属性 但它没有使用它,或者在一小部分功能中使用它,它的内聚性很低。

HAS-A 和 IS-A 都是 class 的依赖项。这就是为什么我们努力将它们都作为抽象,将两者松散地耦合起来。

任何 class/interface 定义,没有它你的 class 将无法编译,是一个依赖项。即使它没有 HAS-A 关系,它只是作为函数参数传递。