プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2017/10/10

ASP.NET Core で設定ファイル(appsettings.json)から設定を取得する

event_note2017/10/10 4:41

ASP.NET Core においては、公式のドキュメントに書いてある通り、Option パターンを使って JSON 形式の設定ファイルから設定を取得できます。

Option パターンでは、関連する設定毎にグループにまとめたオプションクラスを作成します。
クラスを分ける理由は、インターフェイス分離の原則と、関心事の分離の観点からです。

オプションクラスは、パラメーターのない Public なコンストラクタを持つ非抽象クラスでなければなりません。

設定ファイルのサンプル

以下のような JSON ファイル appsettings.json を例とします。

{
  "MyOptions": {
    "Str": "test",
    "Account": {
      "Users": [
        {
          "Name": "hoge",
          "Password": "1235"
        },
        {
          "Name": "piyo",
          "Password": "5678"
        }
      ]
    }
  },
  "MyOptions2": {
    "Str": "test2"
  }
}

データクラス

上記の JSON に対応するクラスを以下のように作成します。

public class MyOptions
{
    public string Str { get; set; }
    public Account Account { get; set; }
}

public class Account
{
    public List<User> Users { get; set; }
}

public class User
{
    public string Name { get; set; }
    public string Password { get; set; }
}

public class MyOptions2
{
    public string Str { get; set; }
}

メンバーは全て Public なプロパティにします。

DI サービスへの登録

Startup クラスの ConfigureServices メソッドで DI サービスへの登録を行います。

MyOptions 全体を登録したい場合は以下のように記述します。

services.AddOptions();
services.Configure<MyOptions>(configuration.GetSection(nameof(MyOptions)));

MyOptionsAccount だけを登録したい場合は以下のように記述します。

services.AddOptions();
// "MyOptions:Account" を nameof を使って記述している
services.Configure<Account>(configuration.GetSection($"{nameof(MyOptions)}:{nameof(Account)}"));

Controller でのデータ取得

Controller にて、DI サービスから設定を取得します。
コンストラクタで以下のように記述することで設定を取得できます。

public class HomeController : Controller
{
    MyOptions settings;
    MyOptions2 settings2;
    Account account;

    public HomeController(IOptions<MyOptions> settings, IOptions<Account> account, IOptions<MyOptions2> settings2)
    {
        // ここで受け取れるオブジェクトは、オブジェクト自体ではなくアクセサオブジェクトであるため、Value プロパティを参照している
        this.settings = settings.Value;
        //this.account = settings.Value.Account;
        this.account = account.Value;
        this.settings2 = settings2.Value;
    }
}

参考 URL