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); }
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); } }
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); } }
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") ) ));
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 */ }
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" />
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!