Enregistrez plusieurs interfaces dans ASP.NET Core pour atteindre
Dans ASP.NET Core, en raison du manque d'enregistrement explicite basé sur la clé, les services multiples enregistrés pour réaliser la même interface apporteront des défis. Ce qui suit est une solution complète, qui est utilisée pour résoudre ce problème et éviter les lacunes du modèle d'usine:
Inscrivez-vous pour implémenter une implémentation spécifique
Implémentation multiple de l'interface d'enregistrement, veuillez utiliser la méthode plusieurs fois et utiliser différents types:
AddTransient
Parser de service personnalisé
<code class="language-csharp">services.AddTransient<ServiceA>();
services.AddTransient<ServiceB>();
services.AddTransient<ServiceC>();</code>
Copier après la connexion
Créer une commission personnalisée appelée , il reçoit une clé de chaîne et renvoie l'exemple de service correspondant:
Dans la méthode , enregistrez un analyseur personnalisé: ServiceResolver
<code class="language-csharp">public delegate IService ServiceResolver(string key);</code>
Copier après la connexion
s'appuyant dans l'utilisateur pour injecter ConfigureServices
Injecter dans les utilisateurs, permettez-leur d'analyser des services spécifiques: <code class="language-csharp">services.AddTransient<ServiceResolver>(serviceProvider => key =>
{
switch (key)
{
case "A":
return serviceProvider.GetService<ServiceA>();
case "B":
return serviceProvider.GetService<ServiceB>();
case "C":
return serviceProvider.GetService<ServiceC>();
default:
throw new KeyNotFoundException();
}
});</code>
Copier après la connexion
Injecter le constructeur à l'aide de données statiques pour injecter
Pour injecter les données statiques dans le constructeur pendant la période d'enregistrement, veuillez définir une méthode de retour d'une instance de service et accepter les données nécessaires en tant que paramètre: ServiceResolver
<code class="language-csharp">public class Consumer
{
private readonly IService _aService;
public Consumer(ServiceResolver serviceAccessor)
{
_aService = serviceAccessor("A");
}
public void UseServiceA()
{
_aService.DoTheThing();
}
}</code>
Copier après la connexion
Enregistrez l'usine en un seul cas pour s'assurer qu'elle est disponible dans tout le cycle de vie de l'application:
Dans la méthode , le type de service est lié à la méthode d'usine:
Grâce à cette méthode, vous pouvez vous inscrire et résoudre de manière transparente la mise en œuvre multiple de l'interface, injecter des données statiques dans le constructeur, éviter les lacunes du mode d'usine et respecter le principe d'injection de dépendance dans le noyau ASP.NET. <code class="language-csharp">public class ServiceFactory
{
public ServiceA CreateServiceA(string efConnectionString)
{
return new ServiceA(efConnectionString);
}
// ... (其他服务的类似方法)
}</code>
Copier après la connexion
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!