Autofac は名前で登録および解決します

サービスを「名前付き」として登録する代わりに、「キー付き」サービスを使用したい場合があります。名前でサービスを指定する方法はありません。ただし、 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>