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

Dependency injection 构造函数注入-我们也注入工厂吗?,dependency-injection,factory-pattern,constructor-injection,Dependency Injection,Factory Pattern,Constructor Injection,听了之后,我明白了我们应该使用工厂来组合对象。因此,例如,如果一个房屋有一个门和一个门有一个门把手,在房屋工厂中,我们创建一个新的门把手并将其传递给门的构造函数,然后将新的门对象传递给房屋的构造函数 但是使用House(比如类名是ABC)的类呢?这将取决于工厂内部的情况,对吗?那么,我们是否在ABC的构造函数中传递HouseFactory?难道我们不需要以这种方式在构造函数中传递大量工厂吗?如果您注入了太多工厂,那么这就是所谓的代码味道,表明您的类做得太多了 许多容器提供了一种称为自动工厂的功能

听了之后,我明白了我们应该使用工厂来组合对象。因此,例如,如果一个
房屋
有一个
和一个
有一个
门把手
,在
房屋工厂
中,我们创建一个新的
门把手
并将其传递给
的构造函数,然后将新的
对象传递给
房屋
的构造函数


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

如果您注入了太多工厂,那么这就是所谓的代码味道,表明您的类做得太多了

许多容器提供了一种称为自动工厂的功能。这意味着如果他们知道如何生成
T
,就会自动生成
Func
类型的工厂

Castle Windsor有一个名为的高级功能,可以动态生成工厂接口的实现


在中还有一个统一的类型化工厂端口。

以门和门把手为例,您不注入工厂,而是注入门把手本身:

public class Door
{
    private readonly DoorKnob doorKnob;

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

        this.doorKnob = doorKnob;
    }
}
在这一层看不到任何工厂

另一方面,房子取决于门,而不是门把手:

public class House
{
    private readonly Door door;

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

        this.door = door;
    }
}
这会使选项保持打开状态,直到最后您必须在应用程序的


您可以使用DI容器在这个级别进行组合,但不必这样做。没有涉及工厂。

如果最终使用Unity,我最近为Unity实现了一个类似于Castle Windsor类型的工厂。您可以在中找到项目,在中找到NuGet包

用法如下:

unityContainer
    .RegisterTypedFactory<IFooFactory>()
    .ForConcreteType<Foo>();
unityContainer
.RegisterTypedFactory()
.ForConcreteType();

您只需使用返回IFoo的方法创建IFooFactory接口,其余工作由库完成。您可以解析IFooFactory并使用它直接创建IFoo对象。

谢谢您的回答。关于词根的问题。当涉及EJB调用或web服务时,组合根应该是什么?这是被调用的方法本身吗?这些都是我不熟悉的Java细节,但是作为一个一般的概念组合发生得很晚:当你不可能再推迟它的时候。
unityContainer
    .RegisterTypedFactory<IFooFactory>()
    .ForConcreteType<Foo>();