Maison >développement back-end >C++ >Comment puis-je enregistrer et résoudre plusieurs implémentations d'interface avec des clés uniques dans l'injection de dépendance au cœur ASP.NET?

Comment puis-je enregistrer et résoudre plusieurs implémentations d'interface avec des clés uniques dans l'injection de dépendance au cœur ASP.NET?

Susan Sarandon
Susan Sarandonoriginal
2025-01-29 21:31:09409parcourir

How Can I Register and Resolve Multiple Interface Implementations with Unique Keys in ASP.NET Core Dependency Injection?

enregistrer et analyser plusieurs interfaces dans ASP.NET Core pour implémenter

Instruction de questions

Lors de l'utilisation des mêmes services d'interface, ils peuvent être un défi basé sur l'enregistrement et l'analyse clés uniques. Contrairement à d'autres conteneurs IOC qui sont autorisés à distinguer l'implémentation spécifique, le système DI par défaut du noyau ASP.NET semble être limité à cet égard.

Solution: utilisez Func pour commander

Afin de surmonter cette limite, elle peut être réalisée en utilisant la commission de partage de type comme schéma variable-Pass.

ServiceResolver Dans le fichier , utilisez le service transitoire et le mappage transitoires

enregistrés:
<code class="language-csharp">public delegate IService ServiceResolver(string key);</code>

Startup.cs Dans n'importe quelle classe injectée par DI, vous pouvez utiliser ServiceResolver pour obtenir le service requis:

<code class="language-csharp">services.AddTransient<ServiceA>();
services.AddTransient<ServiceB>();
services.AddTransient<ServiceC>();

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>

Remarque: ServiceResolver Cette méthode utilise la touche String pour simplifier l'objectif, mais si nécessaire, vous pouvez utiliser n'importe quel type d'analyse personnalisé comme clé.

<code class="language-csharp">public class Consumer
{
    private readonly IService _aService;

    public Consumer(ServiceResolver serviceAccessor)
    {
        _aService = serviceAccessor("A");
    }

    public void UseServiceA()
    {
        _aService.DoTheThing();
    }
}</code>
Autres précautions

Bien que cette solution résout le problème des paris clés et de l'analyse de la mise en œuvre de l'interface multiple, il est nécessaire de prêter attention aux points suivants:

Cette solution implique une cartographie manuelle.

Il ne résout pas le problème de l'injection de données statiques dans le constructeur pendant la période d'inscription. Pour cette raison, envisagez d'utiliser le mode option ou d'autres technologies.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn