Dependency Injection Unity での条件解決
Dependency Injection (DI) により、オブジェクトへの依存関係の自動注入が可能になり、手動の必要性が減ります。インスタンス化と構成。条件解決とは、特定の条件に基づいてインターフェイスのさまざまな実装を動的に解決する機能を指します。
問題:
2 つの認証プロバイダーである TwitterAuth と TwitterAuth を使用した次のシナリオを考えてみましょう。 FacebookAuth、IAuthenticate インターフェイスを実装します:
public interface IAuthenticate { bool Login(string user, string pass); } public class TwitterAuth : IAuthenticate { bool Login(string user, string pass) { /* connect to twitter api */ } } public class FacebookAuth : IAuthenticate { bool Login(string user, string pass) { /* connect to fb api */ } }
コントローラーに、次のことを挿入します。認証プロバイダーに基づく IAuthenticate 実装。この場合、アクション メソッド (Twitter または Facebook など) によって決定されます。
ソリューションとしてのファクトリ パターン:
1 つのアプローチは、友人が提案したように、ファクトリー パターンを使用することです。ただし、これには認証プロバイダーごとにファクトリー クラスを作成する必要があり、コードの重複やメンテナンスの問題が発生する可能性があります。
条件付き解決を使用した戦略パターン:
より柔軟なソリューション戦略パターンを条件付きと組み合わせて使用することです。解決:
インターフェース:
public interface IAuthenticate { bool Login(string user, string pass); bool AppliesTo(string providerName); } public interface IAuthenticateStrategy { bool Login(string providerName, string user, string pass); }
プロバイダーの認証:
public class TwitterAuth : IAuthenticate { bool Login(string user, string pass) { /* connect to twitter api */ } bool AppliesTo(string providerName) { return this.GetType().Name.Equals(providerName); } } public class FacebookAuth : IAuthenticate { bool Login(string user, string pass) { /* connect to fb api */ } bool AppliesTo(string providerName) { return this.GetType().Name.Equals(providerName); } }
各プロバイダーは IAuthenticate を実装し、特定のプロバイダーに適用されるかどうかを判断するメソッドname.
ストラテジー:
public class AuthenticateStrategy : IAuthenticateStrategy { private readonly IAuthenticate[] authenticateProviders; public AuthenticateStrategy(IAuthenticate[] authenticateProviders) { this.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); } }
ストラテジーは IAuthenticate プロバイダーの配列を受け取り、条件付き解決を処理します。プロバイダーを反復処理してプロバイダー名と一致するプロバイダーを見つけ、ログイン操作をそのプロバイダーに委任します。
Unity 登録:
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") ) ));
この登録は Unity を構成しますプロバイダー名によって IAuthenticate 実装を解決し、解決されたこれらを使用して AuthenticateStrategy を注入します。インスタンス。
使用法:
private readonly IAuthenticateStrategy _authenticateStrategy; public AuthenticateController(IAuthenticateStrategy authenticateStrategy) { _authenticateStrategy = authenticateStrategy; } // login with twitter public virtual ActionResult Twitter(string user, string pass) { bool success = _authenticateStrategy.Login("TwitterAuth", user, pass); } // login with fb public virtual ActionResult Facebook(string user, string pass) { bool success = _authenticateStrategy.Login("FacebookAuth", user, pass); }
AuthenticateStrategy がコントローラーに挿入され、プロバイダーに基づいてログイン操作が委任されます。 name.
利点:
以上がUnity 依存関係の注入は複数の認証プロバイダーの条件解決をどのように処理できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。