Autofac registra e risolve con Nomi

Autofac registra e risolve con Nomi

Invece di registrare i tuoi servizi come "denominati", potresti voler utilizzare i servizi "con chiave". Non c'è modo di specificare i servizi in base ai loro nomi. Ma puoi usare IIndex<TKey, TService> per recuperare un oggetto simile a un dizionario con servizi con chiave del tipo specificato. Quindi puoi registrarti:

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");

Successivamente, nel tuo costruttore, puoi iniettare:

public Test(IIndex<string, IService> serviceDictionary)
{
    var service1 = serviceDictionary["key1"];
}

Ho usato string oggetti come chiavi, ma puoi introdurre ad es. enum e usalo come chiave.

MODIFICA:

Se desideri restringere i servizi disponibili per alcune classi, puoi ad es. introdurre diversi tipi di enum come chiavi.

enum ServicesA { A1, A2, A3 }
enum ServicesB { B1, B2 }

Quindi, registrazioni:

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);

Ora, se inietti IIndex<SerivcesA, IService> , solo Service1 , Service2 e Service3 sarebbe disponibile, per IIndex<SerivcesB, IService> sarebbe Service4 e Service5 .

Puoi concatenare Keyed registrazione quindi se ti unisci a entrambe le registrazioni dall'alto a

builder.RegisterType<Service1>().Keyed<IService>(ServicesA.A1).Keyed<IService>("key1");` 

ecc., potresti usare entrambi IIndex<YourEnum, IService> con solo alcuni dei IService implementazioni o IIndex<string, IService> con tutti loro.