我有一个工厂类,它决定应该实例化并返回四个可用子类中的哪一个。正如您所期望的,所有子类都实现相同的接口:
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!");
}
}
}
正如您所看到的,其中一个子类在其构造函数中定义了依赖项。
一些兴趣点:
- 我们使用 Spring.NET 作为我们的 IoC。
- 的所有子类
IFoo
是域对象,因此不会被 Spring.NET 实例化。如果可能的话,我希望保持这种状态。
- 该应用程序有一个手写的数据访问层 (puke),因此这里没有 ORM 发挥作用。
我正在尝试找出如何最好地通过IBar
依赖于Foo3
from FooFactory
。我感觉这可能是通过 IoC 最好解决的问题,但我不太明白如何解决。我也想保留FooFactory
尽可能进行单元测试:即我不希望在我的测试代码中依赖 Spring.NET。
谢谢阅读。
将 FooFactory 更改为抽象工厂并将 IBar 实例注入到具体实现中,如下所示:
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 接口的具体非静态类:
public interface IFooFactory
{
IFoo CreateFoo(FooEnum emum);
}
在代码中任何需要 IFoo 实例的地方,您都将依赖 IFooFactory 并使用其 CreateFoo 方法来创建所需的实例。
您可以使用任何有价值的 DI 容器来连接 FooFactory 及其依赖项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)