【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.cs
의 CreateDefaultBuilder
메소드로 새로운 WebHostBuilder
를 초기화하면(자), appsettings.json
와 appsettings.{環境名}.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("キー名")
를 사용하여 구성 정보를 로드했습니다. 반환 값은 문자열입니다. ↩Reference
이 문제에 관하여(【ASP.NET Core】 JSON 파일에서 정적으로 형식화 된 구성 정보를 쉽게 얻는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Nossa/items/eea0b6fbd9fb891e7675텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)