サービスを「名前付き」として登録する代わりに、「キー付き」サービスを使用したい場合があります。名前でサービスを指定する方法はありません。ただし、 IIndex<TKey, TService>
を使用できます 指定されたタイプのキー付きサービスを含む辞書のようなオブジェクトを取得します。登録できます:
builder.RegisterType<Service1>().Keyed<IService>("key1");
builder.RegisterType<Service2>().Keyed<IService>("key2");
builder.RegisterType<Service3>().Keyed<IService>("key3");
builder.RegisterType<Service4>().Keyed<IService>("key4");
builder.RegisterType<Service5>().Keyed<IService>("key5");
後で、コンストラクターで以下を注入できます。
public Test(IIndex<string, IService> serviceDictionary)
{
var service1 = serviceDictionary["key1"];
}
string
を使用しました オブジェクトをキーとして使用しますが、たとえば導入できます。列挙し、それをキーとして使用します。
編集:
一部のクラスで利用可能なサービスを絞り込みたい場合は、たとえば次のことができます。キーとしてさまざまな列挙型を導入します。
enum ServicesA { A1, A2, A3 }
enum ServicesB { B1, B2 }
次に、登録:
builder.RegisterType<Service1>().Keyed<IService>(ServicesA.A1);
builder.RegisterType<Service2>().Keyed<IService>(ServicesA.A2);
builder.RegisterType<Service3>().Keyed<IService>(ServicesA.A3);
builder.RegisterType<Service4>().Keyed<IService>(ServicesB.B1);
builder.RegisterType<Service5>().Keyed<IService>(ServicesB.B2);
IIndex<SerivcesA, IService>
を注入すると 、Service1
のみ 、 Service2
および Service3
IIndex<SerivcesB, IService>
で利用可能です Service4
になります と Service5
.
Keyed
連鎖できます 登録なので、上記の両方の登録に参加すると
builder.RegisterType<Service1>().Keyed<IService>(ServicesA.A1).Keyed<IService>("key1");`
など、両方の IIndex<YourEnum, IService>
を使用できます IService
の一部のみ 実装または IIndex<string, IService>