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