0

我的问题是对此的一个变体: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 解决这个问题?

4

1 回答 1

1

如果您在 Main 中更改您的注册码,如下所示,您断言将通过。够了吗?

        var container = new UnityContainer();

        var manager = container.Resolve<EventManager>();
        container.RegisterInstance<IEventManager>(manager, new ContainerControlledLifetimeManager());
        container.RegisterInstance<IEventSource>("EventManager", manager, new ContainerControlledLifetimeManager());

        container.RegisterType<IEventSource, EventSourceA>("EventSourceA");
        container.RegisterType<IEventSource, EventSourceB>("EventSourceB");
        container.RegisterType(typeof(Component));

        container.Resolve<Component>();
于 2013-03-08T15:40:56.957 回答