클래스 내에서 IConfidentialClientApplication을 인스턴스화하는 것이 나쁜 습관입니까?

8 양성자

예를 들어, AuthorizationClient내 API와 Azure 간의 인증 토큰에 대한 클라이언트 중재자 역할을하는 애플리케이션 구성에 임시 서비스로 등록되어 있습니다. 내부에는 IConfidentialClientApplication객체 속성이 있습니다.

public class AuthorizationClient : IAuthorizationClient
{
    private readonly string[] _resourceIds;
    private IConfidentialClientApplication App;

    public AuthorizationClient(IAuthenticationConfig AuthenticationConfig, IConfiguration configuration)
    {
        var scope = "/.default";
        var resourceId = "api://" + configuration[AuthenticationConfig.ResourceID] + scope;
        var clientId = configuration[AuthenticationConfig.ClientID];
        var clientSecret = configuration[AuthenticationConfig.ClientSecret];            
        var instance = AuthenticationConfig.Instance;
        var tenant = configuration[AuthenticationConfig.AzureTenantId];        

        var authority = string.Format(CultureInfo.InvariantCulture, instance, tenant);
            
        _resourceIds = new string[] { resourceId };
        try
        {
            App = ConfidentialClientApplicationBuilder.Create(clientId)
            .WithClientSecret(clientSecret)
            .WithAuthority(new Uri(authority))                
            .Build();
        }
        catch(Exception ex)
        {
            //TODO logger
        }

    }
...
}

이 클래스의 다른 곳에서는 토큰을 성공적으로 가져오고 토큰 캐시를 확인하는 등의 메서드가 있습니다.

그러나 IConfidentialClientApplication사용중인 문서 나 리포지토리를 보았을 때 항상 다른 개체 내부가 아닌 애플리케이션 수준에서 서비스로 추가됩니다. 내가이 일을 한 방식에 잠재적 인 함정이 있습니까?

IConfidentialClientApplication새가 모든 클라이언트 요청에 따라 인스턴스화 경우 오히려 / 무거운 큰 것 같다,하지만 응용 프로그램 수준의 서비스를 인 객체의 내부를 인스턴스화 한 바와 같이, 하나의 수명주기에 따라 생성 될 것으로 보인다.

Nkosi

대상 클래스 내에서 종속성을 인스턴스화하는 것은 코드 냄새입니다.

함정 : 구현 세부 사항에 대한 긴밀한 결합 및 명시 적 종속성 원칙 위반.

이로 인해 격리 된 상태에서 클래스를 유지하고 테스트하기가 어렵습니다.

이러한 디자인 문제는 단일 책임 원칙 / 우려 사항 분리 및 명시 적 종속성 원칙을 적용하여 코드를 더욱 견고하게 만들 수 있도록 수정할 수 있습니다.

클라이언트 옵션을 저장할 클래스를 만듭니다. 제공된 예제에 따라 다음과 같이 보일 수 있습니다.

public class AuthorizationClientOptions {
    public string[] ResourceIds { get; set; }
}

기능을 수행하는 데 실제로 필요한 사항에 명시 적으로 의존하도록 클래스를 리팩터링합니다.

public class AuthorizationClient : IAuthorizationClient {
    private readonly string[] _resourceIds;
    private readonly IConfidentialClientApplication app;

    public AuthorizationClient(IConfidentialClientApplication app, IOptions<AuthorizationClientOptions> options) {
        this.app = app;
        _resourceIds = options.Value.ResourceIds;
    }
    
    // ...
}

컴포지션 루트 (시작)에서 필요한 구현 세부 정보를 구성합니다.

//...

IConfiguration Configuration; //Populated either via constructor injection or manually 

public void ConfigureServices(IServiceCollection services) {

    //...
    
    //Configure options
    services.AddOptions<AuthorizationClientOptions>()
        .Configure<IAuthenticationConfig,IConfiguration>(
            (o, authConfig, config) => {
                var scope = "/.default";
                var resourceId = "api://" + config[authConfig.ResourceID] + scope;
                o.ResourceIds = new string[] { resourceId };
            });
            
    //Configure dependency using factory delegate
    services.AddSingleton<IConfidentialClientApplication>(sp => {
        IAuthenticationConfig AuthenticationConfig = sp.GetRequiredService<IAuthenticationConfig>();
        
        var instance = Configuration.Instance;
        var tenant = Configuration[AuthenticationConfig.AzureTenantId];
        var authority = string.Format(CultureInfo.InvariantCulture, instance, tenant);
        
        var clientId = Configuration[AuthenticationConfig.ClientID];
        var clientSecret = Configuration[AuthenticationConfig.ClientSecret];
        
        return ConfidentialClientApplicationBuilder.Create(clientId)
            .WithClientSecret(clientSecret)
            .WithAuthority(new Uri(authority))
            .Build();
    });
    
    services.AddScoped<IAuthorizationClient, AuthorizationClient>();
    
    //...
}

IConfidentialClientApplication새가 모든 클라이언트 요청에 따라 인스턴스화 경우 오히려 / 무거운 큰 것 같다

IConfidentialClientApplication인스턴스화 할 때 일회성 비용이 있도록 위의 예는, 싱글로 만들어집니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Activity의 인스턴스를 매개 변수로 전달하고 다른 클래스에서 finish ()하는 것이 나쁜 습관입니까?

분류에서Dev

도우미에서 인스턴스 변수를 사용하는 것이 나쁜 습관입니까?

분류에서Dev

클래스 네임 스페이스에 다른 개체를 배치하는 것은 나쁜 습관입니까?

분류에서Dev

C #을 선언하는 클래스 내에서 추상 메서드를 호출하는 것은 나쁜 습관입니까?

분류에서Dev

Rails 4 : 모델에서 데이터베이스 작업을 수행하는 것이 나쁜 습관입니까?

분류에서Dev

메서드 / 함수 호출 내에서 개체를 인수로 인스턴스화하는 것은 나쁜 습관입니까?

분류에서Dev

$ scope를 서비스에 전달하는 것이 나쁜 습관입니까?

분류에서Dev

정적 최종 필드에 스레드 로컬 값을 저장하는 것이 나쁜 습관입니까?

분류에서Dev

객체를 인스턴스화하지 않는 정적 클래스를 갖는 것이 나쁜 습관입니까?

분류에서Dev

인터페이스 클래스에서 표준 컨테이너를 반환하는 것이 나쁜 습관입니까?

분류에서Dev

C 구조체 객체를 전역 변수로 인스턴스화하는 것이 나쁜 습관입니까?

분류에서Dev

VMware 스냅 샷을 장기간 보관하는 것이 나쁜 습관 인 이유는 무엇입니까?

분류에서Dev

데이터베이스 내에서 배열을 사용하는 것이 나쁜 설계입니까?

분류에서Dev

클래스 메서드가`this`를 반환하는 것은 나쁜 습관입니까?

분류에서Dev

한 클래스의 모든 하위 클래스를 한 번에 가져 오는 것이 나쁜 습관입니까?

분류에서Dev

인터페이스의 정적 필드에 클래스 구현을 유지하는 것이 나쁜 생각입니까?

분류에서Dev

XSD / WSDL에 항상 하나 이상의 항목이 있도록 웹 서비스 "목록"유형을 지정하는 것이 나쁜 습관입니까?

분류에서Dev

보기에서 파일을 읽는 것이 나쁜 습관입니까?

분류에서Dev

find ()에 부울을 제공하는 것이 나쁜 스타일입니까?

분류에서Dev

JavaScript 클래스, 이와 같은 이벤트 리스너를 추가하는 것은 나쁜 습관입니까?

분류에서Dev

JavaScript 클래스, 이와 같은 이벤트 리스너를 추가하는 것은 나쁜 습관입니까?

분류에서Dev

Kubernetes 클러스터 내부에서 CI / CD를 처리하기 위해 Jenkins Docker 컨테이너를 사용하는 것이 나쁜 습관입니까?

분류에서Dev

자바 스크립트에서 재정의 변수를 사용하는 것이 나쁜 습관입니까?

분류에서Dev

/ root에 스크립트를 보관하는 것이 나쁜 생각입니까?

분류에서Dev

0.0.0.0에서 듣는 것이 나쁜 습관입니까? 왜?

분류에서Dev

OOP에서 클래스 상속 대신 모든 정보를 목록에 넣는 것이 나쁜 습관입니까?

분류에서Dev

스팬을 "버튼"으로 사용하는 것이 나쁜 습관입니까? W3Schools는

분류에서Dev

PostgreSQL 데이터베이스에 특정 시간대를 설정하는 것은 나쁜 습관입니까?

분류에서Dev

스타일 태그에 type = "text / css"를 포함하지 않는 것이 나쁜 습관입니까?

Related 관련 기사

  1. 1

    Activity의 인스턴스를 매개 변수로 전달하고 다른 클래스에서 finish ()하는 것이 나쁜 습관입니까?

  2. 2

    도우미에서 인스턴스 변수를 사용하는 것이 나쁜 습관입니까?

  3. 3

    클래스 네임 스페이스에 다른 개체를 배치하는 것은 나쁜 습관입니까?

  4. 4

    C #을 선언하는 클래스 내에서 추상 메서드를 호출하는 것은 나쁜 습관입니까?

  5. 5

    Rails 4 : 모델에서 데이터베이스 작업을 수행하는 것이 나쁜 습관입니까?

  6. 6

    메서드 / 함수 호출 내에서 개체를 인수로 인스턴스화하는 것은 나쁜 습관입니까?

  7. 7

    $ scope를 서비스에 전달하는 것이 나쁜 습관입니까?

  8. 8

    정적 최종 필드에 스레드 로컬 값을 저장하는 것이 나쁜 습관입니까?

  9. 9

    객체를 인스턴스화하지 않는 정적 클래스를 갖는 것이 나쁜 습관입니까?

  10. 10

    인터페이스 클래스에서 표준 컨테이너를 반환하는 것이 나쁜 습관입니까?

  11. 11

    C 구조체 객체를 전역 변수로 인스턴스화하는 것이 나쁜 습관입니까?

  12. 12

    VMware 스냅 샷을 장기간 보관하는 것이 나쁜 습관 인 이유는 무엇입니까?

  13. 13

    데이터베이스 내에서 배열을 사용하는 것이 나쁜 설계입니까?

  14. 14

    클래스 메서드가`this`를 반환하는 것은 나쁜 습관입니까?

  15. 15

    한 클래스의 모든 하위 클래스를 한 번에 가져 오는 것이 나쁜 습관입니까?

  16. 16

    인터페이스의 정적 필드에 클래스 구현을 유지하는 것이 나쁜 생각입니까?

  17. 17

    XSD / WSDL에 항상 하나 이상의 항목이 있도록 웹 서비스 "목록"유형을 지정하는 것이 나쁜 습관입니까?

  18. 18

    보기에서 파일을 읽는 것이 나쁜 습관입니까?

  19. 19

    find ()에 부울을 제공하는 것이 나쁜 스타일입니까?

  20. 20

    JavaScript 클래스, 이와 같은 이벤트 리스너를 추가하는 것은 나쁜 습관입니까?

  21. 21

    JavaScript 클래스, 이와 같은 이벤트 리스너를 추가하는 것은 나쁜 습관입니까?

  22. 22

    Kubernetes 클러스터 내부에서 CI / CD를 처리하기 위해 Jenkins Docker 컨테이너를 사용하는 것이 나쁜 습관입니까?

  23. 23

    자바 스크립트에서 재정의 변수를 사용하는 것이 나쁜 습관입니까?

  24. 24

    / root에 스크립트를 보관하는 것이 나쁜 생각입니까?

  25. 25

    0.0.0.0에서 듣는 것이 나쁜 습관입니까? 왜?

  26. 26

    OOP에서 클래스 상속 대신 모든 정보를 목록에 넣는 것이 나쁜 습관입니까?

  27. 27

    스팬을 "버튼"으로 사용하는 것이 나쁜 습관입니까? W3Schools는

  28. 28

    PostgreSQL 데이터베이스에 특정 시간대를 설정하는 것은 나쁜 습관입니까?

  29. 29

    스타일 태그에 type = "text / css"를 포함하지 않는 것이 나쁜 습관입니까?

뜨겁다태그

보관