Unity IOC 静态工厂

问题描述 投票:0回答:2

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

.net dependency-injection inversion-of-control unity-container ioc-container
2个回答
7
投票

控制反转/依赖注入和

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
中找不到任何可以处理配置元素的类。您可能必须添加自己的处理程序。


0
投票

公共接口 IFooFactory { Foo Create(); } public class FooFactory : IFooFactory { public Foo Create() { Foo foo = // 创建 Foo return foo; } } }

© www.soinside.com 2019 - 2024. All rights reserved.