Unity IOC静态工厂

cji*_*ibo 2 .net dependency-injection ioc-container inversion-of-control unity-container

有没有办法通过xml配置来表示对象上的静态工厂方法?

jas*_*son 7

控制/依赖注入的反转并且static不能很好地混合.相反,请执行以下操作.有IFooFactory一个具体的实现FooFactory:

public interface IFooFactory {
    Foo Create();
}

public class FooFactory : IFooFactory {
    public Foo Create() {
        Foo foo = // create Foo
        return foo;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,注册FooFactoryIFooFactorywith 的具体实现,ContainerControlledLifeTimeManager以便它像一个单例:

IUnityContainer container = new UnityContainer();
var manager = new ContainerControlledLifeTimeManager();
container.RegisterType<IFooFactory, FooFactory>(manager);
Run Code Online (Sandbox Code Playgroud)

然后,当你需要工厂时:

IFooFactory factory = container.Resolve<IFooFactory>();
Foo foo = factory.Create();
Run Code Online (Sandbox Code Playgroud)

如果您无法改变工厂的实现,以便它没有static方法,那么您将需要创建一个包装器:

public class FooFactoryWrapper {
    public Foo Create() {
        return FooFactoryTypeWithStaticCreateMethod.Create();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后注册

container.Register<IFooFactory, FooFactoryWrapper>();
Run Code Online (Sandbox Code Playgroud)

当然,您也可以注册FooFactoryFooFactoryWrapper作为IFooFactoryXML 的具体实现.如果您需要帮助,请告诉我.

重点是摆脱静电.

也就是说,您可以在Unity中注册静态工厂:

IUnityContainer container = new UnityContainer();
container.AddNewExtension<StaticFactoryExtension>()
         .Configure<IStaticFactoryConfiguration>()
         .RegisterFactory<IFoo>(container => FooFactory.Create());
var foo = container.Resolve<IFoo>(); // uses FooFactory
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何使用XML进行设置,并在使用Reflector进行调整之后我认为不可能.我找不到任何Microsoft.Practices.Unity.StaticFactory可以处理配置元素的类.您可能必须添加自己的处理程序.