我有一个工厂类,该类决定应实例化并返回四个可用子类中的哪个子类。如您所料,所有子类都实现相同的接口(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!");
            }
     }
}

如您所见,子类之一在其构造函数中定义了一个依赖项。

一些兴趣点:
  • 我们正在使用Spring.NET作为IoC。
  • IFoo的所有子类都是域对象,因此不会被Spring.NET实例化。我想尽可能保留这种方式。
  • 该应用程序具有手写的数据访问层(puke),因此此处没有ORM。

  • 我正在尝试找出如何最好地将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/

    10-11 03:59