依賴注入Unity 中的條件解析
依賴注入(DI) 允許將依賴項自動注入到物件中,從而減少手動操作的需要實例化和配置。條件解析是指根據特定條件動態解析介面的不同實作的能力。
問題:
考慮以下場景,其中有兩個驗證提供者: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)決定。
工廠模式作為解決方案:
一種方法是按照您朋友的建議使用工廠模式。但是,這涉及為每個身份驗證提供程序創建一個工廠類,從而導致潛在的程式碼重複和維護問題。
具有條件解析的策略模式:
更靈活的解決方案就是將策略模式與條件結合使用解析:
介面:
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被注入到控制器中,然後控制器根據提供者委託登入操作
優點:
以上是Unity 依賴注入如何處理多個身份驗證提供者的條件解析?的詳細內容。更多資訊請關注PHP中文網其他相關文章!