我有一个工厂类,该类决定应实例化并返回四个可用子类中的哪个子类。如您所料,所有子类都实现相同的接口(interface):
public static class FooFactory{
public IFoo CreateFoo(FooEnum enum){
switch (enum)
{
case Foo1:
return new Foo1();
case Foo2:
return new Foo2();
case Foo3:
return new Foo3(IBar);//has a constructor dependency on IBar
case Foo4:
return new Foo4();
default:
throw new Exception("invalid foo!");
}
}
}
如您所见,子类之一在其构造函数中定义了一个依赖项。
一些兴趣点:
IFoo
的所有子类都是域对象,因此不会被Spring.NET实例化。我想尽可能保留这种方式。 我正在尝试找出如何最好地将
IBar
依赖项从Foo3
传递到FooFactory
中。我感觉这可能是通过IoC最好解决的问题,但是我不太清楚如何处理。我还希望将FooFactory
保持为尽可能可单元测试的:即,我不想在测试代码中不必依赖Spring.NET。谢谢阅读。
最佳答案
将FooFactory更改为抽象工厂并将IBar实例注入(inject)到具体实现中,如下所示:
public class FooFactory : IFooFactory {
private readonly IBar bar;
public FooFactory(IBar bar)
{
if (bar == null)
{
throw new ArgumentNullException("bar");
}
this.bar = bar;
}
public IFoo CreateFoo(FooEnum enum){
switch (enum)
{
case Foo1:
return new Foo1();
case Foo2:
return new Foo2();
case Foo3:
return new Foo3(this.bar);
case Foo4:
return new Foo4();
default:
throw new Exception("invalid foo!");
}
}
}
注意,FooFactory现在是实现IFooFactory接口(interface)的具体的非静态类:
public interface IFooFactory
{
IFoo CreateFoo(FooEnum emum);
}
然后,在代码中需要IFoo实例的任何地方,都将依赖IFooFactory并使用其CreateFoo方法创建所需的实例。
您可以使用任何值得其添加盐的DI容器连接FooFactory及其依赖项。
关于configuration - 通过IoC向工厂类提供依赖关系?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2269056/