【发布时间】:2018-10-29 06:57:23
【问题描述】:
我有一个制造汽车的工厂...它是一个基本工厂,它接受汽车的名称,查找所有实现 ICar 的类,根据汽车名称选择正确的类型并使用反射初始化汽车。
public class CarFactory
{
Dictionary<string, Type> cars;
public ICar CreateInstance(string carName)
{
// choose type of class from all classes that implement ICar
Type t = GetTypeToCreate(carName);
return Activator.CreateInstance(t) as ICar;
}
// some more code...
}
现在,我有一个使用CarFactory 的服务。在我的服务中初始化 CarFactory 的正确方法是什么?
一种解决方案是注入工厂,但工厂模式本身就是 IoC 的一种形式,注入工厂感觉很奇怪。根据Nikola Malovic:
将工厂与 IoC 一起使用没有多大意义,因为 IoC 容器在某种意义上是“通用抽象工厂”。
换句话说,根据我的经验,任何时候我考虑添加一个 工厂我以更简单的基于 IoC 的解决方案结束,这就是为什么我 敢说“IoC杀了工厂之星”
上述内容对我来说完全有意义,尽管我还没有想出用 DI 替换我的工厂的解决方案。
所以我的问题是(对于那些使用工厂模式的人)我应该如何初始化它?
为了避免让问题变得很长,我在这个问题中使用了一个简化的CarFactory 示例。我已经发布了完整的示例here。
【问题讨论】:
-
引用说工厂和 DI 容器做同样的工作,你不需要两种工具来完成一项工作。所以你的问题的答案是没有正确的方法来初始化工厂。不要使用工厂。使用 DI 容器。
-
@jaco0646:谢谢。如果是这种情况,那么就排除了工厂的注入......可以说使用静态工厂是可行的方法(而不是在构造函数中实例化它)吗?就像一个静态 DI 容器?
-
你说的'初始化是什么意思?'
-
@MarkSeemann:谢谢,我的意思是我应该使用静态工厂,在Service的构造函数中实例化工厂还是注入工厂?
标签: design-patterns dependency-injection inversion-of-control factory-pattern