我的问题是对此的一个变体:Unity 将两个接口注册为一个单例
在我的例子中,注入的单例组件有两个接口,但其中一个接口用于映射多个命名的具体类型。
例如,我的组件需要一组(命名的)IEventSources 和一个 IEventManager(它本身也是一个 IEventSource)作为依赖项:
public interface IEventManager { }
public interface IEventSource { }
public class EventManager : IEventManager, IEventSource { }
public class EventSourceA : IEventSource { }
public class EventSourceB : IEventSource { }
public class Component
{
public Component(IEventManager eventManager, IEventSource[] eventSources)
{
Debug.Assert(eventSources.Contains((IEventSource) eventManager));
}
}
class Program
{
static void Main()
{
var container = new UnityContainer();
container.RegisterType<IEventManager, EventManager>(new ContainerControlledLifetimeManager());
container.RegisterType<IEventSource, EventManager>("EventManager", new ContainerControlledLifetimeManager());
container.RegisterType<IEventSource, EventSourceA>("EventSourceA");
container.RegisterType<IEventSource, EventSourceB>("EventSourceB");
container.RegisterType(typeof(Component));
container.Resolve<Component>();
}
}
或者,因为我最终需要从 app.config 进行配置:
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<container>
<register type="IEventManager" mapTo="EventManager">
<lifetime type="singleton" />
</register>
<register name="EventManager" type="IEventSource" mapTo="EventManager">
<lifetime type="singleton" />
</register>
<register name="EventSourceA" type="IEventSource" mapTo="EventSourceA" />
<register name="EventSourceB" type="IEventSource" mapTo="EventSourceB" />
<register type="Component" />
</container>
</unity>
这里创建了两个 EventManager 实例,断言失败。我想确保同一个实例满足两个组件依赖项。
我可以让组件只接受 IEventSource 实例,并在运行时从该集合中拉出单个 IEventManager 实例,但这对我来说似乎很脆弱并且闻起来很糟糕。有没有办法用 Unity 解决这个问题?