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