有没有办法通过xml配置来表示对象上的静态工厂方法?
答案 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中注册FooFactory
或FooFactoryWrapper
作为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
中找不到可以处理配置元素的任何类。您可能需要添加自己的处理程序。