5

Unityを使用してアプリサーバー上のサービスを管理していますが、何らかの理由で「GetAllInstances」メソッドを機能させることができません。奇妙なことに、同じタイプの「GetInstance」は正常に機能しているようです。

構成は次のとおりです。

<alias alias="IService" type="Atom.Server.Infrastructure.Interface.Service.IService, Atom.Server.Infrastructure.Interface"/>
<alias alias="IAtomCommandService" type="Atom.CommandServer.AtomCommandService.Interface.IAtomCommandService, Atom.CommandServer.AtomCommandService.Interface"/>
<alias alias="AtomCommandService" type="Atom.CommandServer.AtomCommandService.AtomCommandService, Atom.CommandServer.AtomCommandService"/>


<register type="IService" mapTo="AtomCommandService">
    <lifetime type="Singleton"/>
</register>
<register type="IAtomCommandService" mapTo="AtomCommandService">
    <lifetime type="Singleton"/>
</register>

サーバーの起動時に、IServiceの構成済みインスタンスをすべて取得して初期化できるようにする必要があるという考え方です。

    IUnityContainer container = ConfigureUnityContainer();
    UnityServiceLocator locator = new UnityServiceLocator(container);

    var single = locator.GetInstance<IService>();
    var all = locator.GetAllInstances<IService>().ToList();

私が言うように、シングルは機能しますが、getallは何も返しません。構成からIAtomCommandServiceマッピングを削除し、IServiceを使用しただけでも、機能しません。私がこれでどこが間違っているのかについてのアイデアはありますか?

4

1 に答える 1

8

Unityが機能する方法は、特定の抽象化に対して1つの名前のない登録のみを受け入れることができるということです。IIRC、同じインターフェイスに別の具象タイプを登録すると、2番目が最初のタイプを上書きします。

したがって、複数のサービスに同じタイプを実装させる唯一の方法は、それらに異なる名前を付けることです。register各要素に名前を付けてみてください。

UnityContainer.ResolveAllは、要求されたタイプのすべての名前付き登録を返しますが、名前なし登録(存在する場合)は返しません。

ところで、 ServiceLocatorアンチパターンは使用しないでください。

于 2011-01-14T09:14:07.660 に答える