🐗

.NETのコンソールアプリでappsettings.jsonを使う (.NET6)

6 min read

概要

ASP.NET Coreのプロジェクトを作成すると、デフォルトでappsettings.jsonが利用できるようになっているが、コンソールアプリの場合は自分で構成する必要があり、その構成方法を確認した。

目的

コンソールアプリで、appsettings.json から設定値を取得できるよう構成する。

graph LR
   A("appsettings.json") --> B["Console(C#)"]

前提

以下の環境で確認

  • .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)を確認する。

https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.extensions.configuration?view=dotnet-plat-ext-6.0

例) ConfigurationBuilder.AddJsonFile を利用したい場合

https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.extensions.configuration.jsonconfigurationextensions.addjsonfile?view=dotnet-plat-ext-6.0#Microsoft_Extensions_Configuration_JsonConfigurationExtensions_AddJsonFile_Microsoft_Extensions_Configuration_IConfigurationBuilder_System_String_System_Boolean_System_Boolean_
ConfigurationBuilder.AddJsonFile
→ Microsoft.Extensions.Configuration.Jsonパッケージが必要。

デモ

0. 内容

以下の2つの取得方法を試す。

  • キーを指定して値をstringで取得
  • モデルにマッピングして取得

1. 準備

プロジェクトを作成する。

コマンド
dotnet new console -o AppSettingsDemo
cd AppSettingsDemo

appsettings.jsonを作成する。

(ここでは .csprojファイル と同階層に作成)
appsettings.jsonを作成

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 

モデルを作成する。

classDiagram
AppSettings o-- ConnectionStrings
AppSettings o-- HttpStatus
AppSettings : string Title
AppSettings : int               Revision
AppSettings : long              LoggingEnabled
AppSettings : ConnectionStrings ConnectionStrings
AppSettings : HttpStatus[]      HttpStatuses
ConnectionStrings : string MainDB
ConnectionStrings : string ReplicaDB
HttpStatus : string Name
HttpStatus : int    Code

クラスファイル

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

ログインするとコメントできます