J'ai des services dérivés de la même interface.
public interface IService { }
public class ServiceA : IService { }
public class ServiceB : IService { }
public class ServiceC : IService { }
En règle générale, d'autres conteneurs IoC comme Unity
vous permettent d'enregistrer des implémentations concrètes par certains Key
qui les distinguent.
Dans ASP.NET Core, comment enregistrer ces services et les résoudre au moment de l'exécution en fonction d'une clé?
Je ne vois aucune Add
méthode de service qui prend un paramètre key
ou name
, qui serait généralement utilisé pour distinguer l'implémentation concrète.
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?
}
}
Le modèle d'usine est-il la seule option ici?
Update1
J'ai parcouru l'article ici qui montre comment utiliser le modèle d'usine pour obtenir des instances de service lorsque nous avons plusieurs implémentations concrètes. Cependant, ce n'est pas encore une solution complète. Quand j'appelle le_serviceProvider.GetService()
méthode, je ne peux pas injecter de données dans le constructeur.
Par exemple, considérez ceci:
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;
}
}
Comment peut-on _serviceProvider.GetService()
injecter la chaîne de connexion appropriée? Dans Unity ou dans toute autre bibliothèque IoC, nous pouvons le faire lors de l'enregistrement du type. Je peux utiliser IOption , cependant, cela me demandera d'injecter tous les paramètres. Je ne peux pas injecter une chaîne de connexion particulière dans le service.
Notez également que j'essaie d'éviter d'utiliser d'autres conteneurs (y compris Unity) car je dois alors enregistrer tout le reste (par exemple, les contrôleurs) avec le nouveau conteneur également.
En outre, l'utilisation du modèle d'usine pour créer des instances de service est contraire à DIP, car elle augmente le nombre de dépendances qu'un client a des détails ici .
Donc, je pense que la DI par défaut dans ASP.NET Core manque deux choses:
- La possibilité d'enregistrer des instances à l'aide d'une clé
- La possibilité d'injecter des données statiques dans les constructeurs lors de l'enregistrement
Update1
être déplacé vers une question différente car l'injection de choses dans les constructeurs est très différente de l'élaboration de l'objet à construire