【发布时间】:2015-08-11 19:31:11
【问题描述】:
我熟悉这些模式,但仍然不知道如何处理以下情况:
public class CarFactory
{
public CarFactory(Dep1,Dep2,Dep3,Dep4,Dep5,Dep6)
{
}
public ICar CreateCar(type)
{
switch(type)
{
case A:
return new Car1(Dep1,Dep2,Dep3);
break;
case B:
return new Car2(Dep4,Dep5,Dep6);
break;
}
}
}
一般来说,问题在于需要注入的引用量。如果有更多的汽车,情况会更糟。
我想到的第一种方法是在工厂构造函数中注入 Car1 和 Car2,但这与工厂方法相反,因为工厂总是返回相同的对象。第二种方法是注入服务定位器,但它到处都是反模式。如何解决?
编辑:
替代方式一:
public class CarFactory
{
public CarFactory(IContainer container)
{
_container = container;
}
public ICar CreateCar(type)
{
switch(type)
{
case A:
return _container.Resolve<ICar1>();
break;
case B:
return _container.Resolve<ICar2>();
break;
}
}
}
替代方式2(由于树中的依赖关系太多,太难使用):
public class CarFactory
{
public CarFactory()
{
}
public ICar CreateCar(type)
{
switch(type)
{
case A:
return new Car1(new Dep1(),new Dep2(new Dep683(),new Dep684()),....)
break;
case B:
return new Car2(new Dep4(),new Dep5(new Dep777(),new Dep684()),....)
break;
}
}
}
【问题讨论】:
-
一个快速的想法是创建一个映射类,它将
type作为输入,并返回您需要的三个Dep#。然后你可以将所有依赖映射到引导程序中映射类的一个实例中,然后将映射实例注入到工厂中。 -
我认为
Alternative way 1在该工厂的实现属于Composition Root时显示没有任何问题。你不应该在你的 DI 容器中注册 DI 容器本身 -
你是什么意思它属于Composition Root?能否提供一些代码示例?
-
Composition Root 是您连接应用程序 DI 容器的地方。因此,例如,这可以是
Bootstrap类。
标签: c# dependency-injection inversion-of-control factory-pattern