Unity IOC静态工厂

时间:2009-12-17 18:40:09

标签: .net dependency-injection inversion-of-control unity-container ioc-container

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

1 个答案:

答案 0 :(得分:7)

控制/依赖注入的反转和static混合不好。相反,请执行以下操作。拥有IFooFactory和具体实施FooFactory

public interface IFooFactory {
    Foo Create();
}

public class FooFactory : IFooFactory {
    public Foo Create() {
        Foo foo = // create Foo
        return foo;
    }
}

然后,使用FooFactory注册IFooFactory作为ContainerControlledLifeTimeManager的具体实现,以便它像单身人士一样:

IUnityContainer container = new UnityContainer();
var manager = new ContainerControlledLifeTimeManager();
container.RegisterType<IFooFactory, FooFactory>(manager);

然后,当你需要工厂时:

IFooFactory factory = container.Resolve<IFooFactory>();
Foo foo = factory.Create();

如果你不能改变工厂的实现,使它没有static方法,那么你需要创建一个包装器:

public class FooFactoryWrapper {
    public Foo Create() {
        return FooFactoryTypeWithStaticCreateMethod.Create();
    }
}

然后注册

container.Register<IFooFactory, FooFactoryWrapper>();

当然,您也可以在XML中注册FooFactoryFooFactoryWrapper作为IFooFactory的具体实现。如果您需要帮助,请告诉我。

重点是摆脱静电。

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

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

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