0

私の問題はこれのバリエーションです: Unity Register two interfaces as one singleton

私の場合、注入されたシングルトン コンポーネントには 2 つのインターフェイスがありますが、それらのインターフェイスの 1 つを使用して複数の名前付き具象型をマップします。

たとえば、私のコンポーネントは依存関係として、(名前付きの) 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>

ここでは、2 つの EventManager インスタンスが作成され、アサーションは失敗します。同じインスタンスが両方のコンポーネントの依存関係を満たしていることを確認したいと考えています。

コンポーネントに IEventSource インスタンスのみを受け入れさせ、実行時にそのセットから単一の IEventManager インスタンスを引き出すことができますが、それはもろく、私には悪臭がします。Unityでこれを実現する方法はありますか?

4

1 に答える 1

1

以下のようにメイン内で登録コードを変更すると、合格と断言できます。それで十分でしょうか?

        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 に答える