首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unity IOC静态工厂

Unity IOC静态工厂
EN

Stack Overflow用户
提问于 2009-12-18 02:40:09
回答 1查看 4.6K关注 0票数 2

有没有办法通过xml配置来表示对象上的静态工厂方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-12-18 02:51:55

控制反转/依赖注入和static不能很好地混合。相反,请执行以下操作。有一个IFooFactory和一个具体的实现FooFactory

代码语言:javascript
复制
public interface IFooFactory {
    Foo Create();
}

public class FooFactory : IFooFactory {
    public Foo Create() {
        Foo foo = // create Foo
        return foo;
    }
}

然后,使用ContainerControlledLifeTimeManager注册FooFactory作为IFooFactory的具体实现,这样它就可以像单例一样工作:

代码语言:javascript
复制
IUnityContainer container = new UnityContainer();
var manager = new ContainerControlledLifeTimeManager();
container.RegisterType<IFooFactory, FooFactory>(manager);

然后,当您需要工厂时:

代码语言:javascript
复制
IFooFactory factory = container.Resolve<IFooFactory>();
Foo foo = factory.Create();

如果您不能更改工厂的实现,使其不具有static方法,那么您将需要创建一个包装器:

代码语言:javascript
复制
public class FooFactoryWrapper {
    public Foo Create() {
        return FooFactoryTypeWithStaticCreateMethod.Create();
    }
}

然后注册

代码语言:javascript
复制
container.Register<IFooFactory, FooFactoryWrapper>();

当然,您也可以在XML中注册FooFactoryFooFactoryWrapper作为IFooFactory的具体实现。如果你需要帮助,请告诉我。

主要的一点是远离静态。

也就是说,以下是如何在Unity中注册静态工厂的方法:

代码语言:javascript
复制
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中找不到任何可以处理配置元素的类。您可能需要添加自己的处理程序。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1923725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档