配置 – 通过IoC将依赖项提供给工厂类?
发布时间:2020-12-14 00:51:10 所属栏目:百科 来源:网络整理
导读:我有一个工厂类,它决定它应该实例化和返回的四个可用子类中的哪一个.正如您所料,所有子类都实现相同的接口: public static class FooFactory{ public IFoo CreateFoo(FooEnum enum){ switch (enum) { case Foo1: return new Foo1(); case Foo2: return new
我有一个工厂类,它决定它应该实例化和返回的四个可用子类中的哪一个.正如您所料,所有子类都实现相同的接口:
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. 我试图弄清楚如何最好地将FarFactory中的IBar依赖项传递给Foo3.我觉得这可能是通过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及其依赖项. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |