我应该通过构造函数注入在我的类中明确具体的类依赖吗?

dev*_*ium 9 c# java oop dependency-injection

我正在设计一个小项目,我没有对所有类的接口使用编程.我发现有些类几乎不需要改变,所以我让它们被客户端类作为具体类引用.

所以,假设我们已经ClassB消费了以下消费ClassA:

替代文字

class ClassB {
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,我应该建立ClassBClassA,或者我应该传递责任"向上"的层次?我将描述两种情况:

class ClassA {
    private ClassB classB;

    public ClassA() {
        this.classB = new ClassB();
    }
}
Run Code Online (Sandbox Code Playgroud)

要么

class ClassA {
    private ClassB classB;

    public ClassA(ClassB classB) {
        this.classB = classB;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道你将如何做到这一点以及它背后的理由是什么!

谢谢

Mar*_*ath 3

第一个选项(A 创建 B)的一些优点:

  1. A 类的用户不需要了解 B 类或如何创建和配置它。这使得编程模型更加简单。
  2. B 也可以设为私有/内部,这样库的用户就不需要费力地浏览许多他们不需要看到的帮助器类。
  3. 您可以更改 A 的工作方式,根本不使用 B,而不会破坏调用代码。
  4. 封装——当 A 运行时,没有人可以从外部篡改 B

第二个选项的一些优点(A 依赖于 B):

  1. A 类的用户可以完全控制 B 对象 - 他们可以对其进行不同的配置,如果愿意,他们可以将同一个对象传递到 A 的多个实例中。
  2. 它为传入不同的实现打开了大门(如果 B 是接口或基类),这对于单元测试或可扩展性具有很大的价值。
  3. 更新:如果将来创建B变得更加复杂(例如B有自己的一些依赖项),那么可以在外部进行管理,而不需要对A进行更改。

请注意,也可以通过使用有时称为“穷人的依赖注入”来创建“两全其美”的解决方案:

class ClassA {
    private ClassB classB;

    public ClassA(ClassB classB) {
        this.classB = classB;
    }

    public ClassA() : this(new ClassB()) {

    }
}
Run Code Online (Sandbox Code Playgroud)