.NET Core/System.Configuration名前空間がない

提供: MonoBook
ナビゲーションに移動 検索に移動

NuGetサーバーをLinuxで動かすべくASP .NET Core移植しようとしたところ、.NET CoreにSystem.Configuration名前空間がないことが判明した。ググったところ.NET CoreではNuGetにある「Microsoft.Extensions.Configuration」を使うらしい。

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration

設定ファイルの形式は古いSystem.ConfigurationではXML(app.configなど)だけだったが、新しいMicrosoft.Extensions.ConfigurationではINIXMLJSONから選べる。また、コマンドライン引数環境変数から設定する手段も用意されている。

各設定値は文字列をキーとするPOCO(単純なプロパティだけのクラス)にバインディングされる。

例:JSON + コンソールアプリ[編集 | ソースを編集]

利用するNuGetパッケージ
  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.Json
appsettings.json
{
  "option1": "value1_from_json",

  "option2": 2,

  "subsection": {
    "suboption1": "subvalue1_from_json"
  },

  "wizards": [
    {
      "Name": "Gandalf",
      "Age": "1000"
    },
    {
      "Name": "Harry",
      "Age": "17"
    }
  ]
}
Program.cs
using Microsoft.Extensions.Configuration;
using System;
using System.IO;

// Add NuGet <package id="Microsoft.Extensions.Configuration" and
// <package id="Microsoft.Extensions.Configuration.Json"
// .NET Framework 4.x use the following path:
//.SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), @"..\.."))

public class Program
{
    public static IConfigurationRoot Configuration { get; set; }

    public static void Main(string[] args = null)
    {
        var builder = new ConfigurationBuilder()
             .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json");

        Configuration = builder.Build();

        Console.WriteLine($"option1 = {Configuration["option1"]}");
        Console.WriteLine($"option2 = {Configuration["option2"]}");
        Console.WriteLine($"suboption1 = {Configuration["subsection:suboption1"]}");
        Console.WriteLine();

        Console.WriteLine("Wizards:");
        Console.Write($"{Configuration["wizards:0:Name"]}, ");
        Console.WriteLine($"age {Configuration["wizards:0:Age"]}");
        Console.Write($"{Configuration["wizards:1:Name"]}, ");
        Console.WriteLine($"age {Configuration["wizards:1:Age"]}");
    }
}

階層構造は「:(コロン)」区切りで表現する。

Console.WriteLine($"option1 = {Configuration["subsection:suboption1"]}");

配列をは階層構造と同様にコロン区切りを利用し、変数名の部分にインデックス番号(0からスタート)を指定する。

Console.Write($"{Configuration["wizards:0:Name"]}, ");

関連項目[編集 | ソースを編集]