继续使用 Door 和 DoorKnob 示例,您不会注入工厂 - 您会注入 DooKnob 本身:
public class Door
{
private readonly DoorKnob doorKnob;
public Door(DoorKnob doorKnob)
{
if (doorKnob == null)
throw new ArgumentNullException("doorKnob");
this.doorKnob = doorKnob;
}
}
在这个级别上看不到任何工厂。
另一方面,House 依赖于 Door,但不依赖于 DoorKnob:
public class House
{
private readonly Door door;
public House(Door door)
{
if (door == null)
throw new ArgumentNullException("door");
this.door = door;
}
}
这使选项保持打开状态,直到最后您必须在应用程序的Composition Root中组合所有内容:
var house = new House(new Door(new DoorKnob()));
您可以使用 DI 容器在此级别进行组合,但您不必这样做。不涉及任何工厂。