C # 9 레코드를 IOptions로 사용할 수 있습니까?

Nov 21 2020

저는 방금 C # 9와 .NET 5.0, 특히 새로운 record구조를 가지고 놀기 시작했습니다 . 레코드 유형의 속기 구문에 대한 훌륭한 사용 사례가 많이 있습니다.

내가 고려한 사용 사례 중 하나는 ASP.NET Core 애플리케이션에 대해 일반 클래스 대신 record에서 dto를 사용하는 것이 었습니다 IOptions<>. 이러한 옵션 클래스는 일반적으로 매우 평범하기 때문에 완벽하게 맞을 것이라고 생각했지만을 사용하여 응용 프로그램을 구성 IOptions<>하려면 개체에 매개 변수가없는 생성자가 있어야 하므로 쉽게 작동 할 수없는 것 같습니다 .

public record MyOptions(string OptionA, int OptionB);

public class Startup
{
    public void ConfigureServices(IServiceCollection services) {
        services.Configure<MyOptions>(Configuration.GetSection(nameof(MyOptions)));
    }
...
}

public class MyController : Controller 
{
    private readonly MyOptions _options;
    public MyController(IOptions<MyOptions> options) {
        _options = options.Value;  // This throws an exception at runtime
    }
}

위의 예에서는 IOption<>.Value속성 에 액세스하려고 할 때 다음 예외가 발생 합니다.

System.MissingMethodException : ''AcmeSolution.MyOptions '형식에 대해 정의 된 매개 변수없는 생성자가 없습니다.'

IOptions매개 변수없는 생성자를 요구하는 대신 레코드의 생성자를 사용하여 옵션을 역 직렬화하도록 구성 시스템 을 구성하는 방법이 있습니까?

레코드에 대해 긴 구문을 사용할 수 있지만 클래스를 사용하는 것보다 실제로 이점이 없습니다.

답변

9 Blindy Nov 20 2020 at 23:28

매개 변수가없는 생성자를 요구하는 대신 레코드의 생성자를 사용하여 옵션을 역 직렬화하도록 IOptions 구성 시스템을 구성하는 방법이 있습니까?

아니요, 일반적으로 ASP.Net Core는 많은 런타임 유형 인스턴스를 사용하므로 미리 알려진 생성자 호출이 필요하며이 경우 인수가없는 생성자가 필요합니다.

그러나 레코드 클래스에 매개 변수가없는 생성자를 만들 수 있습니다.

public record MyOptions(string OptionA, int OptionB)
{
    public MyOptions(): this(default, default) {}
}

그만한 가치가 있습니까? 뭐라고. 당신에게 달렸습니다. 성능면에서 정규 수업보다 나쁘지 않으므로 더 명확하게 찾으면 가십시오!

편집 : 또는 다음 양식을 사용할 수 있습니다.

public record MyOptions(string OptionA = default, int OptionB = default);