Unity IOC Static Factory - PullRequest
       25

Unity IOC Static Factory

2 голосов
/ 17 декабря 2009

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

1 Ответ

7 голосов
/ 17 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...