【ASP.NET Core】 JSON 파일에서 정적으로 형식화 된 구성 정보를 쉽게 얻는 방법

12573 단어 JSONC#ASP.NET_Core

소개



ASP.NET Core에서 JSON 파일에서 설정 정보를 얻어 앱에 반영하는 단계입니다.
설정을 문자열로 읽는 것이 아니라 클래스에 바인딩하고 형식화하여 안전하게 취급하고 싶습니다. 1

.NET Core SDK 버전은 2.1이며 Visual Studio for Mac을 사용합니다.
$ dotnet --version
2.1.302

샘플은 다음의 dotnet 명령, 또는 Visual Srtuio 로 새로운 Web API 프로젝트를 작성한 것입니다.
dotnet new webapi -o 'OptionsPattern'

참조한 URL
ASP.NET Core 옵션 패턴
ASP.NET Core에서 AppSetting을 구성하는 방법

설정 정보의 기술과 그것을 바인드하는 클래스의 작성


appsettings.json 에 자신의 설정 정보를 추가합니다.

appsettings.json
  {
+   "option1": "value1_from_json",
+   "option2": -1,
+   "option3": "1637bb4c-fff4-48d9-af98-3e9d8f022ecc"
    "Logging": {
      "LogLevel": {
        "Default": "Warning"
      }
    },
    "AllowedHosts": "*"
  }

추가한 구성 정보를 바인드하는 옵션 클래스를 작성합니다.
속성 이름을 JSON 키 이름과 동일하게 만듭니다. (대문자 소문자는 달라도 괜찮습니다.)
이번은 string 형, int 형, Guid 형에 바인드 해 보겠습니다.
public class MyOptions {
  public string Option1 { get; set; }
  public int Option2 { get; set; }
  public Guid Option3 { get; set; }
}

구성 정보 바인딩 및 DI 컨테이너에 등록


Startup.cs 에서 설정 정보를 옵션 클래스에 바인딩하고 DI 컨테이너에 등록합니다.

Startup.cs
public class Startup {
  public Startup(IConfiguration config) {
    // コンストラクタでコンフィグを初期化
    Configuration = config;
  }

  public IConfiguration Configuration { get; }

  public void ConfigureServices(IServiceCollection services) {
    // オプションを使用するためのサービスを追加します。
    services.AddOptions();
    // バインドするオプションクラスに対し、設定情報を登録します。
    services.Configure<MyOptions>(Configuration);

    // ※上記は services.AddMvc() より前で設定しなくても動きましたが、公式ドキュメント通り、前で設定しています。
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
  }
  // 以下略
}

이것만으로 준비 완료입니다.

설정 정보를 이용하려면



설정 정보를 바인드한 옵션 클래스를 이용하려면 , 클래스의 constructor 인수에 IOptionsMonitor<TOptions> 를 가지면 OptionsMonitor<TOptions> 의 인스턴스가 DI 됩니다.
옵션 클래스는 OptionsMonitor.CurrentValue 프로퍼티로부터 얻어집니다.

이번에는 컨트롤러 클래스를 만들고 설정 정보를 이용하고 싶습니다.

OptionsController.cs
[Route("api/[controller]")]
[ApiController]
public class OptionsController: ControllerBase {

  // コンストラクタで OptionsMonitor<TOptions> が DI される
  public OptionsController(IOptionsMonitor<MyOptions> optionsMonitor) {
    // CurrentValueプロパティでオプションクラスのインスタンスが得られる
    options = optionsMonitor.CurrentValue;
  }

  // オプションクラスのインスタンスをフィールドに保持
  private readonly MyOptions options;

  // api/options
  [HttpGet]
  public IActionResult GetOptions() {
    // JSON で返してみる
    return Ok(options);
  }
}

디버깅하고 https://localhost:ポート番号/api/options 브라우저에서 액세스합니다.
다음 이미지와 같이 설정 정보가 클래스에 바인딩되어 있는지 확인할 수 있습니다.

응답이 반환됩니다. (※ Chrome 확장의 Json Viewer에서 보기 쉽게 하고 있습니다.)


중첩된 JSON 구성 정보 로드



구성 정보를 섹션으로 나누어 JSON에 작성하는 경우 다음과 같이 로드합니다.

appsettings.json
  {
    "option1": "value1_from_json",
    "option2": -1,
-   "option3": "1637bb4c-fff4-48d9-af98-3e9d8f022ecc"
+   "option3": "1637bb4c-fff4-48d9-af98-3e9d8f022ecc",
+   "subsection": {
+     "suboption1": "subvalue1_from_json",
+     "suboption2": 200,
+     "suboption3": "b2d0caf4-2aa0-4272-a175-50351282ab0f"
+   },
    "Logging": {
      "LogLevel": {
        "Default": "Warning"
      }
    },
    "AllowedHosts": "*"
  }

MySubOptions.cs
// バインドするクラスを用意
public class MySubOptions {
  public string SubOption1 { get; set; }
  public int SubOption2 { get; set; }
  public Guid SubOption3 { get; set; }
}

Startup.cs에서 발췌
  public void ConfigureServices(IServiceCollection services) {
    services.AddOptions();
    services.Configure<MyOptions>(Configuration);

+   // Configuration.GetSection("セクションのキー名") で読み込める
+   services.Configure<MySubOptions>(Configuration.GetSection("subsection"));

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
  }

OptionsController.cs
  [Route("api/[controller]")]
  [ApiController]
  public class OptionsController: ControllerBase {
    private readonly MyOptions options;
    private readonly MySubOptions subOptions;

+   // セクションに分けずに記述した設定と同様に扱える
-   public OptionsController(IOptionsMonitor<MyOptions> optionsMonitor) {
+   public OptionsController(
+     IOptionsMonitor<MyOptions> optionsMonitor,
+     IOptionsMonitor<MySubOptions> subOptionsMonitor
+   ) {
      options = optionsMonitor.CurrentValue;
+     subOptions = subOptionsMonitor.CurrentValue;
    }

    [HttpGet]
    public IActionResult GetOptions() {
      return Ok(options);
    }

+   [HttpGet("sub")]
+   public IActionResult GetSubOptions() {
+     return Ok(subOptions);
+   }
  }

중첩된 설정 정보가 바인딩되었는지 확인할 수 있습니다.



JSON 파일은 어디에서 로드되어 있습니까?



ASP.NET Core에서 JSON 파일을 로드하려면 ConfigurationBuilder AddJsonFile 확장 메서드를 호출합니다.
다만, Program.csCreateDefaultBuilder 메소드로 새로운 WebHostBuilder 를 초기화하면(자), appsettings.jsonappsettings.{環境名}.json 는 자동으로 읽어들여지기 때문에, 이번은 그쪽에 설정을 기술했습니다.

Program.cs에서 발췌
// ここで自動的に appsettings.json が読み込まれる
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();

샘플 URL



GitHub의 다음 리포지토리에 이 샘플을 배치했습니다.
이번 생략한 네임스페이스의 가져오기 등을 확인하는 경우 여기에서 확인해 주세요.
htps : // 기주 b. 코 m / 사노 - 곧 / 오 치 온 s 파 r



기존 .NET Framework에서는 App.config xml 파일에서 System.Configuration 네임스페이스 ConfigurationSettings.AppSettings("キー名")를 사용하여 구성 정보를 로드했습니다. 반환 값은 문자열입니다.

좋은 웹페이지 즐겨찾기