본문 바로가기
프로그래밍/C#

.NET Options Pattern 사용하기

by bantomak 2024. 4. 9.

Options 패턴

options 패턴은 세팅 데이터(configuration data)에 접근하도록 도와주는 강력한 도구이다. 즉, 프로그래머가 클래스를 정의하고 option 패턴을 이용해서 설정 파일에서 값을 가져와서 바인딩하면 이를 인스턴스 객체로 선언해서 사용이 가능하게 만든다.

 

appsettings.json 파일

appsettings.json에 정의된 "Units" 내용

"Units": {
  "Temp": "Celsius",
  "Distance": "Miles"
}

 

바인딩 클래스 만들기

Option 패턴을 사용하기 위해서 클래스를 생성한다.

public class UnitOptions
{
	public string Temp { get; set; } = String.Empty;
	public string Distance { get; set; } = String.Empty;
}

 

Startup.cs에서 Configure를 호출해서 클래스와 appsettings.json의 데이터를 바인딩해 준다.

// Startup.cs
builder.Services.Configure<UnitOptions>(builder.Configuration.GetSection("Units"));

 

Option 패턴 사용 예제

IOption은 싱글톤으로 존재하며 서비스가 실행되는 동안 설정 데이터를 가져오는 역할을 한다. 싱글톤으로 존재하기 때문에 앱이 실행된 이후에는 해당 설정 데이터는 변경될 수 없다.

public class TransientService
{
    private readonly UnitOptions _unitOptions;

    public TransientService(IOptions<UnitOptions> unitOptions)
    {
        _unitOptions = unitOptions.Value;
    }
    
    public UnitOptions GetUnits()
    {
        return _unitOptions;
    }
}

 

IOption vs IConfiguration

기존에 잘 쓰고 있던 IConfiguration이 있는데 왜 IOption에 대해서 알아야 할까?

이는 설정 데이터를 가지고 있는 IConfiguration 전체를 주입하지 않고 IConfiguration의 일정 부분만 선택해서 바인딩해서 별도의 서비스에서 사용이 가능하기 때문이다.

 

  • 가독성 측면에서 유리하다. 파악해야 하는 내용이 적어진다.
  • 전체(IConfiguration)보다는 특정 부분(IOption)에 대해서 의존하는 게 변경에 유리하다.

 

함께 읽으면 좋은 글

 

What is the use case of IOptions versus IConfiguration (other than IOptions allows mapping to object)?

I can inject the IConfiguration config into constructor and then access the app settings from json file via config["settignName"]; Example code inside service class: public MyService(

stackoverflow.com

참고 사이트

 

Options Pattern In .NET 6.0

Read configuration data in .NET apps using options pattern that enables strongly typed access to the configuration settings.

www.c-sharpcorner.com

 

Options lifecycle in ASP.NET Core dependency injection

Which lifetime cycle has the configuration object got when it's registered the following way? Is it a singleton, transient or scoped? { services.Configure<SomeConfiguration>(configura...

stackoverflow.com

 

How To Use The Options Pattern In ASP.NET Core 7

In this week's newsletter I want to show you how you can use the powerful Options pattern in ASP.NET Core 7. The options pattern uses classes to provide strongly typed settings in your application at runtime. The values for the options instance can come fr

www.milanjovanovic.tech

댓글