cji*_*ibo 2 .net dependency-injection ioc-container inversion-of-control unity-container
有没有办法通过xml配置来表示对象上的静态工厂方法?
控制/依赖注入的反转并且static不能很好地混合.相反,请执行以下操作.有IFooFactory一个具体的实现FooFactory:
public interface IFooFactory {
Foo Create();
}
public class FooFactory : IFooFactory {
public Foo Create() {
Foo foo = // create Foo
return foo;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,注册FooFactory为IFooFactorywith 的具体实现,ContainerControlledLifeTimeManager以便它像一个单例:
IUnityContainer container = new UnityContainer();
var manager = new ContainerControlledLifeTimeManager();
container.RegisterType<IFooFactory, FooFactory>(manager);
Run Code Online (Sandbox Code Playgroud)
然后,当你需要工厂时:
IFooFactory factory = container.Resolve<IFooFactory>();
Foo foo = factory.Create();
Run Code Online (Sandbox Code Playgroud)
如果您无法改变工厂的实现,以便它没有static方法,那么您将需要创建一个包装器:
public class FooFactoryWrapper {
public Foo Create() {
return FooFactoryTypeWithStaticCreateMethod.Create();
}
}
Run Code Online (Sandbox Code Playgroud)
然后注册
container.Register<IFooFactory, FooFactoryWrapper>();
Run Code Online (Sandbox Code Playgroud)
当然,您也可以注册FooFactory或FooFactoryWrapper作为IFooFactoryXML 的具体实现.如果您需要帮助,请告诉我.
重点是摆脱静电.
也就是说,您可以在Unity中注册静态工厂:
IUnityContainer container = new UnityContainer();
container.AddNewExtension<StaticFactoryExtension>()
.Configure<IStaticFactoryConfiguration>()
.RegisterFactory<IFoo>(container => FooFactory.Create());
var foo = container.Resolve<IFoo>(); // uses FooFactory
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何使用XML进行设置,并在使用Reflector进行调整之后我认为不可能.我找不到任何Microsoft.Practices.Unity.StaticFactory可以处理配置元素的类.您可能必须添加自己的处理程序.
| 归档时间: |
|
| 查看次数: |
4488 次 |
| 最近记录: |