Unity IOC Static Factory

Есть ли способ через конфигурацию XML для обозначения статического метода фабрики на объекте?

1 ответ

Решение

Инверсия управления / внедрение зависимости и 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 это может обрабатывать элемент конфигурации. Вы, вероятно, должны добавить свой собственный обработчик.

Другие вопросы по тегам