Ho servizi derivati dalla stessa interfaccia.
public interface IService { }
public class ServiceA : IService { }
public class ServiceB : IService { }
public class ServiceC : IService { }
In genere, altri contenitori IoC come Unity
consentono di registrare implementazioni concrete da parte di alcuni Key
che le distinguono.
In ASP.NET Core, come posso registrare questi servizi e risolverli in fase di esecuzione in base a una chiave?
Non vedo alcun Add
metodo di servizio che accetta un key
o un name
parametro, che in genere verrebbe utilizzato per distinguere l'implementazione concreta.
public void ConfigureServices(IServiceCollection services)
{
// How do I register services of the same interface?
}
public MyController:Controller
{
public void DoSomething(string key)
{
// How do I resolve the service by key?
}
}
Il modello Factory è l'unica opzione qui?
Aggiornamento 1
Ho esaminato l'articolo qui che mostra come utilizzare il modello di fabbrica per ottenere istanze di servizio quando disponiamo di più implementazioni concrete. Tuttavia, non è ancora una soluzione completa. Quando chiamo il _serviceProvider.GetService()
metodo, non riesco a iniettare dati nel costruttore.
Ad esempio, considera questo:
public class ServiceA : IService
{
private string _efConnectionString;
ServiceA(string efconnectionString)
{
_efConnecttionString = efConnectionString;
}
}
public class ServiceB : IService
{
private string _mongoConnectionString;
public ServiceB(string mongoConnectionString)
{
_mongoConnectionString = mongoConnectionString;
}
}
public class ServiceC : IService
{
private string _someOtherConnectionString
public ServiceC(string someOtherConnectionString)
{
_someOtherConnectionString = someOtherConnectionString;
}
}
Come si può _serviceProvider.GetService()
iniettare la stringa di connessione appropriata? In Unity o in qualsiasi altra libreria IoC, possiamo farlo al momento della registrazione del tipo. Posso usare IOption , tuttavia, che mi richiederà di iniettare tutte le impostazioni. Non riesco a iniettare una particolare stringa di connessione nel servizio.
Si noti inoltre che sto cercando di evitare di utilizzare altri contenitori (incluso Unity) perché in seguito devo registrare tutto il resto (ad esempio, i controller) con il nuovo contenitore.
Inoltre, l'utilizzo del modello factory per creare istanze di servizio è contrario a DIP, in quanto aumenta il numero di dipendenze che un cliente ha dettagli qui .
Quindi, penso che al DI predefinito in ASP.NET Core manchino due cose:
- La possibilità di registrare istanze utilizzando una chiave
- La possibilità di iniettare dati statici nei costruttori durante la registrazione
Update1
essere spostato su una domanda diversa poiché iniettare cose nei costruttori è molto diverso dal capire quale oggetto costruire