【问题标题】:Unity IOC Static FactoriesUnity IOC 静态工厂
【发布时间】:2010-12-27 18:43:25
【问题描述】:

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

【问题讨论】:

    标签: .net dependency-injection inversion-of-control unity-container ioc-container


    【解决方案1】:

    控制反转/依赖注入和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 方法,那么您将需要创建一个包装器:

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

    然后注册

    container.Register<IFooFactory, FooFactoryWrapper>();
    

    当然,你也可以注册FooFactoryFooFactoryWrapper作为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 进行设置,在使用反射器四处寻找之后,我认为这是不可能的。我在Microsoft.Practices.Unity.StaticFactory 中找不到任何可以处理配置元素的类。您可能必须添加自己的处理程序。

    【讨论】:

    • 我同意你的观点,但我们正在尝试采用使用 Spring.NET 并以这种方式实现的旧代码。我们正在尝试最低限度地更改工作代码并替换 IOC。唯一的原因。我们正在做的 WPF 项目目前计划使用 Unity,因为 Prism 并且不想编写新的 Bootstrapper。
    • 好的,在那种情况下,我添加了如何在 Unity 中注册工厂方法。但是,我不知道如何通过 XML 配置它,我认为这是不可能的。您可能必须创建自己的处理程序。
    • +1 确认如果我想要 IoC 应该远离静态工厂方法
    • 为什么静态工厂方法在概念上比构造函数更糟糕?例如。如果静态工厂方法没有参数,则它等效于无参数构造函数。如果静态工厂方法有参数,它也不比等效的构造函数差。此外,Unity 现在通过 InjectionFactory 类为工厂方法提供一流的支持。
    • 不确定谁说的更糟。两者都很糟糕。请详细说明。
    猜你喜欢
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多