构造函数注入 - 我们也注入工厂吗?

Can*_*ell 9 dependency-injection factory-pattern constructor-injection

在听完清洁代码会谈之后,我开始明白我们应该使用工厂来组合对象.因此,例如,如果a House有a Door和a Door有a DoorKnob,则在HouseFactory我们创建new DoorKnob并将其传递给构造函数Door,然后将该新Door对象传递给构造函数House.

但是使用的类House (比如类名ABC)呢?这将取决于HouseFactory,对吗?那么我们传递HouseFactory构造函数ABC吗?我们不是必须以这种方式在构造函数中传递大量工厂吗?

Mar*_*ann 10

继续使用Door和DoorKnob示例,您不注入工厂 - 您注入了DooKnob本身:

public class Door
{
    private readonly DoorKnob doorKnob;

    public Door(DoorKnob doorKnob)
    {
        if (doorKnob == null)
            throw new ArgumentNullException("doorKnob");

        this.doorKnob = doorKnob;
    }
}
Run Code Online (Sandbox Code Playgroud)

这个级别没有工厂可见.

另一方面,House取决于Door,但不取决于DoorKnob:

public class House
{
    private readonly Door door;

    public House(Door door)
    {
        if (door == null)
            throw new ArgumentNullException("door");

        this.door = door;
    }
}
Run Code Online (Sandbox Code Playgroud)

这使选项保持打开状态,直到最后你必须在应用程序的组合根中组成所有内容:

var house = new House(new Door(new DoorKnob()));
Run Code Online (Sandbox Code Playgroud)

您可以使用DI容器在此级别进行构图,但您不必这样做.没有工厂参与.