🐗
.NETのコンソールアプリでappsettings.jsonを使う (.NET6)
概要
ASP.NET Coreのプロジェクトを作成すると、デフォルトでappsettings.jsonが利用できるようになっているが、コンソールアプリの場合は自分で構成する必要があり、その構成方法を確認した。
目的
コンソールアプリで、appsettings.json から設定値を取得できるよう構成する。
前提
以下の環境で確認
- .NET 6
- Visual Studio Code
- Windows 10
結果
dotnetコマンドで必要なパッケージを追加する。
パッケージ名 | 要否 | 説明 |
---|---|---|
Microsoft.Extensions.Configuration | 必須 | - |
Microsoft.Extensions.Configuration.Json | 必須 | - |
Microsoft.Extensions.Configuration.Binder | 任意 | 設定情報をモデルにマッピングして取得する場合に必要 |
コマンド書式
dotnet add package {パッケージ名} [--version {バージョン}]
コマンド例
dotnet add package Microsoft.Extensions.Configuration --version 6.0.0
以下のページから利用するクラス選択 → メソッド選択 → ページ上部のアセンブリ(*.dll)を確認する。
例) ConfigurationBuilder.AddJsonFile を利用したい場合
→ Microsoft.Extensions.Configuration.Jsonパッケージが必要。
デモ
0. 内容
以下の2つの取得方法を試す。
- キーを指定して値をstringで取得
- モデルにマッピングして取得
1. 準備
プロジェクトを作成する。
コマンド
dotnet new console -o AppSettingsDemo
cd AppSettingsDemo
appsettings.jsonを作成する。
(ここでは .csprojファイル と同階層に作成)
appsettings.json
{
"Title": "hatahata",
"Revision": 10,
"LoggingEnabled": true,
"ConnectionStrings": {
"MainDB": "Server=172.24.1.11; Port=5432; Database=MAIN;",
"ReplicaDB": "Server=172.24.1.21; Port=5432; Database=REPL;"
},
"HttpStatuses": [
{
"Name": "Ok",
"Code": 200
},
{
"Name": "NotFound",
"Code": 404
}
]
}
appsettings.jsonをビルド結果に含める。
AppSettingsDemo.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
+ <ItemGroup>
+ <None Update="appsettings.json">
+ <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+ </None>
+ </ItemGroup>
</Project>
2. 設定値をstringで取得
パッケージを追加する。
コマンド
dotnet add package Microsoft.Extensions.Configuration --version 6.0.0
dotnet add package Microsoft.Extensions.Configuration.Json --version 6.0.0
appsettings.jsonを読み込んで値を取得するようソースを変更。
Program.cs
using Microsoft.Extensions.Configuration;
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
// キーを指定して値を取得
Console.WriteLine(configuration["Title"]);
Console.WriteLine(configuration["Revision"]);
Console.WriteLine(configuration["LoggingEnabled"]);
Console.WriteLine(configuration["ConnectionStrings:MainDB"]);
Console.WriteLine(configuration.GetConnectionString("ReplicaDB"));
Console.WriteLine(configuration["HttpStatuses:0:Name"]);
Console.WriteLine(configuration["HttpStatuses:0:Code"]);
実行する。
コマンド
dotnet run
実行結果
hatahata
10
True
Server=172.24.1.11; Port=5432; Database=MAIN;
Server=172.24.1.21; Port=5432; Database=REPL;
Ok
200
3. 設定値をモデルにマッピングして取得
パッケージを追加する。
コマンド
dotnet add package Microsoft.Extensions.Configuration.Binder --version 6.0.0
モデルを作成する。
AppSettings.cs
class AppSettings
{
public string Title { get; set; } = "";
public int Revision { get; set; }
public bool LoggingEnabled { get; set; }
public ConnectionStrings ConnectionStrings { get; set; } = new ConnectionStrings();
public HttpStatus[] HttpStatuses { get; set; } = new HttpStatus[] { };
}
ConnectionStrings.cs
class ConnectionStrings
{
public string MainDB { get; set; } = "";
public string ReplicaDB { get; set; } = "";
}
HttpStatus.cs
class HttpStatus
{
public string Name { get; set; } = "";
public int Code { get; set; }
}
モデルにマッピングして取得するようソースを変更。
Program.cs
using Microsoft.Extensions.Configuration;
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
// AppSettingsクラスのインスタンスとして設定値を取得
var appSettings = configuration.Get<AppSettings>();
// 出力
Console.WriteLine(appSettings.Title);
Console.WriteLine(appSettings.Revision);
Console.WriteLine(appSettings.LoggingEnabled);
Console.WriteLine(appSettings.ConnectionStrings.MainDB);
Console.WriteLine(appSettings.ConnectionStrings.ReplicaDB);
foreach (var sc in appSettings.HttpStatuses)
{
Console.WriteLine($"{sc.Name} : {sc.Code}");
}
// HttpStatusesだけ取得
var httpStatuses = configuration.GetSection("HttpStatuses").Get<HttpStatus[]>();
Console.WriteLine("---");
// 出力
foreach (var sc in httpStatuses)
{
Console.WriteLine($"{sc.Name} : {sc.Code}");
}
実行する。
コマンド
dotnet run
実行結果
hatahata
10
True
Server=172.24.1.11; Port=5432; Database=DEMO;
Server=172.24.1.21; Port=5432; Database=REPL;
Ok : 200
NotFound : 404
---
Ok : 200
NotFound : 404
--- 以上 ---
Discussion
appsettings.jsonファイルをビルド結果に含めたり、AddJsonFileをしなくてもキーバリューを取得できるようです
他人のふんどしですが、以下参考記事です