首頁 >後端開發 >C++ >Unity 依賴注入如何處理多個身份驗證提供者的條件解析?

Unity 依賴注入如何處理多個身份驗證提供者的條件解析?

Linda Hamilton
Linda Hamilton原創
2024-12-31 18:00:27380瀏覽

How Can Unity Dependency Injection Handle Conditional Resolution for Multiple Authentication Providers?

依賴注入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 註冊即可。
  • 可維護:減少重複並提高程式碼可讀性,因為特定於提供者的程式碼包含在單獨的類別中。
  • 可測試:策略模式可以更輕鬆地對各個驗證提供者進行單元測試。

以上是Unity 依賴注入如何處理多個身份驗證提供者的條件解析?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn