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>();