有没有办法通过 xml 配置来表示对象上的静态工厂方法?
控制反转/依赖注入和
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 进行设置,并且在使用 Reflector 进行研究后,我认为这是不可能的。我在
Microsoft.Practices.Unity.StaticFactory
中找不到任何可以处理配置元素的类。您可能必须添加自己的处理程序。
公共接口 IFooFactory { Foo Create(); } public class FooFactory : IFooFactory { public Foo Create() { Foo foo = // 创建 Foo return foo; } } }