ホームページ >バックエンド開発 >C++ >Unity dependency Injection を使用して、プロバイダーの種類に基づいてさまざまな認証メカニズムを条件付きで解決するにはどうすればよいですか?

Unity dependency Injection を使用して、プロバイダーの種類に基づいてさまざまな認証メカニズムを条件付きで解決するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-29 18:32:10202ブラウズ

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

Unity の依存関係注入における条件付き解決

条件付き解決により、コンテナーは特定の基準に基づいてインターフェイスのさまざまな実装を解決し、注入できます。この場合、Unity を使用して、使用される認証のタイプ (Twitter、Facebook など) に基づいてさまざまな認証メカニズムを条件付きで解決することを目的としています。

Interfaces

認証動作を表す IAuthenticate インターフェイスを定義します。 AppliesTo メソッドを追加して、プロバイダーが指定されたプロバイダー名に適用されるかどうかを確認します。

public interface IAuthenticate
{
    bool Login(string user, string pass);
    bool AppliesTo(string providerName);
}

Authentication Providers

IAuthenticate を実装し、特定の認証ロジックを含めます。 AppliesTo メソッドで、指定されたプロバイダー名に基づいてプロバイダーが適用可能かどうかを判断します。

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 Registration

認証プロバイダーと戦略を登録します。 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 の登録を実行できます。

<register type="IAuthenticate" mapTo="TwitterAuth" name="twitterAuth" />
<register type="IAuthenticate" mapTo="FacebookAuth" name="facebookAuth" />
<register type="IAuthenticateStrategy" mapTo="AuthenticateStrategy" />

以上がUnity dependency Injection を使用して、プロバイダーの種類に基づいてさまざまな認証メカニズムを条件付きで解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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