it-swarm-ko.tech

ServiceCollection에서 IConfiguration 가져 오기

모듈 유형을 등록하기 위해 ServiceCollection에 대한 자체 확장 방법을 작성 중이며 컬렉션에서 IConfiguration 인스턴스에 액세스하여 옵션을 등록해야합니다.

확장 방법

public static IServiceCollection AddApi(this IServiceCollection services)
{
  // Get configuration from collection
  var configuration = (IConfiguration) services.FirstOrDefault(p => p.ServiceType == typeof(IConfiguration)).ImplementationInstance;

  services.Configure<DatabaseOptions>(configuration.GetSection("Database"));
}

컬렉션에서 IConfiguration 인스턴스를 가져 오는 올바른 방법입니까 아니면 더 우아한 솔루션이 있습니까? IConfiguration 인스턴스를 매개 변수로 메서드에 추가하고 싶지 않습니다.

15
Jehof

의견에 따르면 확장 방법을 다음과 같이 변경하여 옵션의 구성 섹션을 제공하는 응용 프로그램의 composer)까지입니다.

public static IServiceCollection AddApi(this IServiceCollection services, IConfiguration databaseConfiguration)
{  
  services.Configure<DatabaseOptions>(databaseConfiguration);
}

startUp 클래스에서 호출은 다음과 같습니다.

public void ConfigureServices(IServiceCollection services)
{
  services.AddApi(Configuration.GetSection("Database"));
  services.AddMvc();
}

이런 식으로 사용하기로 한 결정은 대부분 이러한 의견에 의해 결정됩니다. 이 방법은 응용 프로그램에서 사용하는 내부 구성 요소보다 많은 개발자가 사용하는 구성 요소를 개발할 때 더 관련성이 있습니다.

구성 루트 (ASP.NET 코어의 시작 클래스) 내부를 제외하고 어디에서나 IConfiguration에 액세스하는 것은 나쁜 디자인입니다. 이는 구성 파일이 전혀 변경 될 수없는 특정 구조를 가져야한다는 것을 의미합니다. 대신, 컴포지션 루트 내부에서 구성 클래스를 구성하고 .Configure (Configuration.GetSection ( "MyLibConfi‌g")와 유사한 방법으로 IConfiguration 개체를 전달하는 확장 메서드를 작성했습니다.이 방법으로 응용 프로그램을 작성하는 개발자 컴포넌트에서 appsettings.json 내에 배치 할 위치를 결정할 수 있습니다.

또는 두 라이브러리가 IConfiguration을 직접 참조하고 구성 내에서 동일한 섹션을 가질 때 충돌을 어떻게 해결합니까? 즉, JsonSettings이지만 완전히 다른 구조를 가지고 있습니까? 그것을 구성하는 개발자가 섹션 이름을 선택하고 확장 방법으로 전달하여 .Configure를 통해 옵션을 설정하도록함으로써 만 해결할 수 있습니다.

3
Jehof

IServiceCollectionIConfiguration를 래핑하는 자체 "서비스 모음"유형을 만들었으며 모든 모듈은 해당 유형을 사용하여 서비스를 등록합니다. 예를 들면 다음과 같습니다.

public interface IMyServiceCollection
{
    public IServiceCollection Services { get; set; }

    public IConfiguration Configuration { get; set; }
}

public static void AddFooModule(this IMyServiceCollection myServices)
{
    var services = myServices.Services;
    var config = myServices.Configuration;
}

그런 다음 IMyServiceCollection에 대한 구현을 작성하는 매개 변수로 구성 인스턴스를 사용하여 확장 메소드를 작성해야합니다.

public static IMyServiceCollection CreateServiceCollection(this IServiceCollection services, IConfiguration config)
{
    return new MyServiceCollection 
    { 
        Services = services,
        Configuration = config
    };
}

우리는 이것을 모듈 형 프레임 워크에서 사용하고 있습니다. 간단한 응용 프로그램의 경우 이것은 과잉입니다.

귀하의 솔루션도 훌륭하다고 생각합니다. 그러나 IConfiguration 인스턴스에 자주 액세스해야하는 경우 서비스 컬렉션에서 조금 지루한 검색이있을 수 있습니다.

3
Henk Mollema