有没有办法通过xml配置来表示对象上的静态工厂方法?
发布于 2009-12-18 02:51:55
控制反转/依赖注入和static不能很好地混合。相反,请执行以下操作。有一个IFooFactory和一个具体的实现FooFactory
public interface IFooFactory {
Foo Create();
}
public class FooFactory : IFooFactory {
public Foo Create() {
Foo foo = // create Foo
return foo;
}
}然后,使用ContainerControlledLifeTimeManager注册FooFactory作为IFooFactory的具体实现,这样它就可以像单例一样工作:
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中找不到任何可以处理配置元素的类。您可能需要添加自己的处理程序。
https://stackoverflow.com/questions/1923725
复制相似问题