Dev/dotnet core

옵션 패턴(Option pattern)

catchv 2023. 7. 11. 21:43
반응형

옵션 클래스:

  • 매개 변수가 없는 public 생성자를 사용하는 비추상이어야 합니다.
  • 형식의 모든 공용 읽기-쓰기 속성이 바인딩됩니다.
  • 필드가 바인딩되지 않습니다. 위 코드에서 Position은 바운딩되지 않습니다. Position 필드를 사용하므로 클래스를 구성 공급자에 바인딩할 때 문자열 "Position"을 앱에서 하드 코딩하지 않아도 됩니다.
public class PositionOptions
{
    public const string Position = "Position";

    public string Title { get; set; } = String.Empty;
    public string Name { get; set; } = String.Empty;
}
  # JSON - appsettings.json
  "Position": {
    "Title": "Editor",
    "Name": "Joe Smith"
  }

1. ConfigurationBinder.Bind

var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);

 

2. ConfigurationBinder.Get<T>

var positionOptions = Configuration.GetSection(PositionOptions.Position).Get<PositionOptions>();

3.  IoC(Inversion of Control)

// Program.cs
builder.Services.Configure<PositionOptions>(
	builder.Configuration.GetSection(PositionOptions.Position));

// class
public class test
{
	private readonly PositionOptions _options;
	private readonly PositionOptions _optionsSnapshot;
	private readonly IOptionsMonitor<PositionOptions> _optionsDelegate;

    public test(		
    	IOptions<PositionOptions> options,
		IOptionsSnapshot<PositionOptions> optionsSnapshot,
		IOptionsMonitor<PositionOptions> optionsDelegate
        )
    {
		_options = options.Value;
		_optionsSnapshot = optionsSnapshot.Value;
		_optionsDelegate = optionsDelegate;
    }
}

 

1) IOptions<TOptions>:

  • 다음을 지원하지 않습니다.
    • 앱이 시작된 후 구성 데이터 읽기
    • 명명된 옵션
  • Singleton으로 등록되며 서비스 수명에 주입할 수 있습니다.

2) IOptionsSnapshot<TOptions>:

  • 모든 요청에서 옵션을 다시 계산해야 하는 시나리오에서 유용합니다. 자세한 내용은 IOptionsSnapshot을 사용하여 업데이트된 데이터를 참조하세요.
  • 범위 지정됨으로 등록되므로 Singleton 서비스에 주입할 수 없습니다.
  • 명명된 옵션을 지원합니다.

3) IOptionsMonitor<TOptions>:

  • 옵션을 검색하고 TOptions 인스턴스에 대한 옵션 알림을 관리하는 데 사용됩니다.
  • Singleton으로 등록되며 서비스 수명에 주입할 수 있습니다.
  • 지원:
    • 변경 알림
    • 명명된 옵션
    • 다시 로드할 수 있는 구성
    • 선택적 옵션 무효화(IOptionsMonitorCache<TOptions>)

3. AddOption

builder.Services.AddOptions<PositionOptions>()
	.Bind(builder.Configuration.GetSection(PositionOptions.Position))
    .ValidateDataAnnotations()
    .ValidateOnStart();

 

 

4. Program.cs 에서 options 읽기

var app = builder.Build();

var option1 = app.Services.GetRequiredService<IOptionsMonitor<MyOptions>>()
    .CurrentValue.Option1;
반응형

'Dev > dotnet core' 카테고리의 다른 글

dotnet middleware 순서  (0) 2023.07.05
dotnet user-secrets  (0) 2023.05.24
vault v2 api  (0) 2023.04.20
Entityframwork core Parameter value 확인  (0) 2023.04.11