首頁 > 後端開發 > C++ > 如何使用 Unity 依賴注入根據提供者類型有條件地解析不同的身份驗證機制?

如何使用 Unity 依賴注入根據提供者類型有條件地解析不同的身份驗證機制?

DDD
發布: 2024-12-29 18:32:10
原創
177 人瀏覽過

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

Unity 依賴注入中的條件解析

條件解析允許容器根據特定條件解析和注入介面的不同實現。在本例中,我們的目標是使用 Unity 根據所使用的身份驗證類型(例如 Twitter、Facebook 等)有條件地解析不同的身份驗證機制。

介面

定義一個IAuthenticate介面來表示認證行為。新增 AppliesTo 方法來檢查提供者是否適用於指定的提供者名稱。

public interface IAuthenticate
{
    bool Login(string user, string pass);
    bool AppliesTo(string providerName);
}
登入後複製

驗證提供者

建立單獨的類別(例如 TwitterAuth 和 FacebookAuth)實作 IAuthenticate 並包含特定的驗證邏輯。在AppliesTo方法中,根據提供的provider名稱判斷該provider是否適用。

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); }
}
登入後複製

Strategy

實作IAuthenticateStrategy接口,封裝條件解析邏輯。注入一組 IAuthenticate 提供者並使用 AppliesTo 方法選擇正確的提供者進行驗證。

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);
    }
}
登入後複製

Unity 註冊

使用以下方式註冊身份驗證提供程序和策略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")
        )
    ));
登入後複製

用法

在控制器中,注入IAuthenticateStrategy 並使用它基於提供者執行條件驗證name.

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

或者,您可以在unity.config 檔案中執行Unity 註冊🎜>

或者,您可以在unity.config 檔案中執行Unity 註冊。
<register type="IAuthenticate" mapTo="TwitterAuth" name="twitterAuth" />
<register type="IAuthenticate" mapTo="FacebookAuth" name="facebookAuth" />
<register type="IAuthenticateStrategy" mapTo="AuthenticateStrategy" />
登入後複製

以上是如何使用 Unity 依賴注入根據提供者類型有條件地解析不同的身份驗證機制?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板