ホームページ >バックエンド開発 >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?

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 の登録を変更するだけで簡単に行えます。
  • 保守可能: 重複を減らし、改善しますプロバイダー固有のコードが別のクラスに含まれているため、コードの可読性が向上します。
  • テスト可能: Strategy パターンにより、個々の認証プロバイダーの単体テストが容易になります。

以上がUnity 依存関係の注入は複数の認証プロバイダーの条件解決をどのように処理できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。