【发布时间】:2010-12-27 18:43:25
【问题描述】:
有没有办法通过 xml 配置来表示对象上的静态工厂方法?
【问题讨论】:
标签: .net dependency-injection inversion-of-control unity-container ioc-container
有没有办法通过 xml 配置来表示对象上的静态工厂方法?
【问题讨论】:
标签: .net dependency-injection inversion-of-control unity-container ioc-container
控制反转/依赖注入和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>();
当然,你也可以注册FooFactory或FooFactoryWrapper作为IFooFactory在XML中的具体实现。如果您需要这方面的帮助,请告诉我。
重点是远离静态。
也就是说,在 Unity 中注册静态工厂的方法如下:
IUnityContainer container = new UnityContainer();
container.AddNewExtension<StaticFactoryExtension>()
.Configure<IStaticFactoryConfiguration>()
.RegisterFactory<IFoo>(container => FooFactory.Create());
var foo = container.Resolve<IFoo>(); // uses FooFactory
我不知道如何使用 XML 进行设置,在使用反射器四处寻找之后,我认为这是不可能的。我在Microsoft.Practices.Unity.StaticFactory 中找不到任何可以处理配置元素的类。您可能必须添加自己的处理程序。
【讨论】:
InjectionFactory 类为工厂方法提供一流的支持。