백엔드 개발 C++ Unity 종속성 주입은 여러 인증 공급자에 대한 조건부 해결을 어떻게 처리할 수 있나요?

Unity 종속성 주입은 여러 인증 공급자에 대한 조건부 해결을 어떻게 처리할 수 있나요?

Dec 31, 2024 pm 06:00 PM

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

종속성 주입 Unity의 조건부 해결

종속성 주입(DI)을 사용하면 종속성을 객체에 자동으로 주입할 수 있어 수동 작업의 필요성이 줄어듭니다. 인스턴스화 및 구성. 조건부 해결은 특정 조건을 기반으로 인터페이스의 다양한 구현을 동적으로 해결하는 기능을 의미합니다.

문제:

두 인증 공급자인 TwitterAuth 및 IAuthenticate 인터페이스를 구현하는 FacebookAuth:

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 */ }
}
로그인 후 복사

컨트롤러에 인증 공급자를 기반으로 구현을 인증합니다. 이 경우 작업 방법(예: 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으로 문의하세요.

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

C 언어 함수에 의해 반환 된 값 유형은 무엇입니까? 반환 값을 결정하는 것은 무엇입니까? C 언어 함수에 의해 반환 된 값 유형은 무엇입니까? 반환 값을 결정하는 것은 무엇입니까? Mar 03, 2025 pm 05:52 PM

C 언어 함수에 의해 반환 된 값 유형은 무엇입니까? 반환 값을 결정하는 것은 무엇입니까?

Gulc : C 도서관은 처음부터 구축되었습니다 Gulc : C 도서관은 처음부터 구축되었습니다 Mar 03, 2025 pm 05:46 PM

Gulc : C 도서관은 처음부터 구축되었습니다

C 언어 함수 형식 문자 케이스 변환 단계 C 언어 함수 형식 문자 케이스 변환 단계 Mar 03, 2025 pm 05:53 PM

C 언어 함수 형식 문자 케이스 변환 단계

C 언어 기능의 정의 및 호출 규칙은 무엇이며 C 언어 기능의 정의 및 호출 규칙은 무엇이며 Mar 03, 2025 pm 05:53 PM

C 언어 기능의 정의 및 호출 규칙은 무엇이며

뚜렷한 사용 및 문구 공유 뚜렷한 사용 및 문구 공유 Mar 03, 2025 pm 05:51 PM

뚜렷한 사용 및 문구 공유

메모리에 저장된 C 언어 함수의 반환 값은 어디에 있습니까? 메모리에 저장된 C 언어 함수의 반환 값은 어디에 있습니까? Mar 03, 2025 pm 05:51 PM

메모리에 저장된 C 언어 함수의 반환 값은 어디에 있습니까?

C 표준 템플릿 라이브러리 (STL)는 어떻게 작동합니까? C 표준 템플릿 라이브러리 (STL)는 어떻게 작동합니까? Mar 12, 2025 pm 04:50 PM

C 표준 템플릿 라이브러리 (STL)는 어떻게 작동합니까?

STL (정렬, 찾기, 변환 등)의 알고리즘을 효율적으로 사용하려면 어떻게합니까? STL (정렬, 찾기, 변환 등)의 알고리즘을 효율적으로 사용하려면 어떻게합니까? Mar 12, 2025 pm 04:52 PM

STL (정렬, 찾기, 변환 등)의 알고리즘을 효율적으로 사용하려면 어떻게합니까?

See all articles