Unity容器:注册两个单例,实现两个接口,其中一个是常见的

时间:2012-06-06 07:54:29

标签: c# .net unity-container resolve service-locator

我无法弄清楚如何使用UnityContainer进行操作。

interface A { }
interface B { }
interface X { }
class ConcreteAX : A, X { }
class ConcreteBX : B, X { }

我需要注册两个具体的类,因此ServiceLocator.ResolveAll<X>应该返回两个实例。同一时间Resolve<A>Resolve<B>也应该有效。此外,我必须在注册服务时自己实例化。

如果我使用X的命名注册来使ResolveAll工作,则会创建每个具体类的两个实例。如果我对所有接口使用命名注册,则Resolve<A>Resolve<B>不起作用。如果我使用this方法,则ResolveAll不返回任何内容。

如何使用UnityContainer进行操作?

1 个答案:

答案 0 :(得分:5)

使用解析默认注册的ExternallyControlledLifetimeManagerInjectionFactory进行第二次(命名)注册。例如:

unity.RegisterType<A, ConcreteAX>(new ContainerControlledLifetimeManager());
unity.RegisterType<B, ConcreteBX>(new ContainerControlledLifetimeManager());
unity.RegisterType<X, ConcreteAX>("AX", 
    new ExternallyControlledLifetimeManager(), 
    new InjectionFactory(u => u.Resolve<A>()));
unity.RegisterType<X, ConcreteBX>("BX", 
    new ExternallyControlledLifetimeManager(), 
    new InjectionFactory(u => u.Resolve<B>()));
相关问题