.net Unity IOC静态工厂

qojgxg4l  于 2023-05-30  发布在  .NET
关注(0)|答案(1)|浏览(248)

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

ymdaylpp

ymdaylpp1#

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

public interface IFooFactory {
    Foo Create();
}

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

然后,将FooFactory注册为IFooFactoryContainerControlledLifeTimeManager的具体实现,以便它像单例一样工作:

IUnityContainer container = new UnityContainer();
var manager = new ContainerControlledLifeTimeManager();
container.RegisterType<IFooFactory, FooFactory>(manager);

当你需要工厂时:

IFooFactory factory = container.Resolve<IFooFactory>();
Foo foo = factory.Create();

如果你不能改变工厂的实现,使它没有static方法,那么你需要创建一个 Package 器:

public class FooFactoryWrapper {
    public Foo Create() {
        return FooFactoryTypeWithStaticCreateMethod.Create();
    }
}

然后注册

container.Register<IFooFactory, FooFactoryWrapper>();

当然,您也可以在XML中注册FooFactoryFooFactoryWrapper作为IFooFactory的具体实现。如果你需要帮助就告诉我。
关键是要远离静电。
也就是说,以下是如何在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中找不到任何可以处理配置元素的类。您可能需要添加自己的处理程序。

相关问题