Maison > développement back-end > C++ > Comment Unity Dependency Injection peut-il être utilisé pour résoudre conditionnellement différents mécanismes d'authentification en fonction du type de fournisseur ?

Comment Unity Dependency Injection peut-il être utilisé pour résoudre conditionnellement différents mécanismes d'authentification en fonction du type de fournisseur ?

DDD
Libérer: 2024-12-29 18:32:10
original
199 Les gens l'ont consulté

How can Unity Dependency Injection be used to conditionally resolve different authentication mechanisms based on provider type?

Résolution conditionnelle dans l'injection de dépendances Unity

La résolution conditionnelle permet au conteneur de résoudre et d'injecter différentes implémentations d'une interface en fonction de critères spécifiques. Dans ce cas, nous visons à utiliser Unity pour résoudre conditionnellement différents mécanismes d'authentification en fonction du type d'authentification utilisé (par exemple, Twitter, Facebook, etc.).

Interfaces

Définissez une interface IAuthenticate pour représenter le comportement d'authentification. Ajoutez une méthode AppliesTo pour vérifier si le fournisseur s'applique au nom de fournisseur spécifié.

public interface IAuthenticate
{
    bool Login(string user, string pass);
    bool AppliesTo(string providerName);
}
Copier après la connexion

Fournisseurs d'authentification

Créez des classes distinctes (par exemple, TwitterAuth et FacebookAuth) qui implémente IAuthenticate et contient la logique d'authentification spécifique. Dans la méthode AppliesTo, déterminez si le fournisseur est applicable en fonction du nom du fournisseur fourni.

public class TwitterAuth : IAuthenticate
{
    bool Login(string user, string pass) { /* Logic to connect to Twitter API */ }
    bool AppliesTo(string providerName) { return this.GetType().Name.Equals(providerName); }
}
Copier après la connexion

Stratégie

Implémentez une interface IAuthenticateStrategy pour encapsuler la logique de résolution conditionnelle . Injectez un tableau de fournisseurs IAuthenticate et utilisez la méthode AppliesTo pour sélectionner le bon fournisseur pour l'authentification.

public interface IAuthenticateStrategy
{
    bool Login(string providerName, string user, string pass);
}

public class AuthenticateStrategy : IAuthenticateStrategy
{
    private readonly IAuthenticate[] _authenticateProviders;

    public AuthenticateStrategy(IAuthenticate[] authenticateProviders) => _authenticateProviders = authenticateProviders;

    public bool Login(string providerName, string user, string pass)
    {
        var provider = _authenticateProviders.FirstOrDefault(x => x.AppliesTo(providerName));

        if (provider == null)
        {
            throw new Exception("Login provider not registered");
        }

        return provider.Login(user, pass);
    }
}
Copier après la connexion

Enregistrement Unity

Enregistrez les fournisseurs d'authentification et la stratégie avec Unity, spécifiant les noms des fournisseurs pour les conditions résolution.

unityContainer.RegisterType<IAuthenticate, TwitterAuth>("twitterAuth");
unityContainer.RegisterType<IAuthenticate, FacebookAuth>("facebookAuth");
unityContainer.RegisterType<IAuthenticateStrategy, AuthenticateStrategy>(
    new InjectionConstructor(
        new ResolvedArrayParameter<IAuthenticate>(
            new ResolvedParameter<IAuthenticate>("twitterAuth"),
            new ResolvedParameter<IAuthenticate>("facebookAuth")
        )
    ));
Copier après la connexion

Utilisation

Dans le contrôleur, injectez IAuthenticateStrategy et utilisez-le pour effectuer une authentification conditionnelle basée sur le nom du fournisseur.

public AuthenticateController(IAuthenticateStrategy authenticateStrategy)
{
    if (authenticateStrategy == null)
        throw new ArgumentNullException(nameof(authenticateStrategy));

    _authenticateStrategy = authenticateStrategy;
}

public virtual ActionResult Twitter(string user, string pass)
{
    bool success = _authenticateStrategy.Login("TwitterAuth", user, pass); /* Authenticate using Twitter */
}

public virtual ActionResult Facebook(string user, string pass)
{
    bool success = _authenticateStrategy.Login("FacebookAuth", user, pass); /* Authenticate using Facebook */
}
Copier après la connexion

unity.config

Alternativement, vous pouvez effectuer l'enregistrement Unity dans le fichier unity.config.

<register type="IAuthenticate" mapTo="TwitterAuth" name="twitterAuth" />
<register type="IAuthenticate" mapTo="FacebookAuth" name="facebookAuth" />
<register type="IAuthenticateStrategy" mapTo="AuthenticateStrategy" />
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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal