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)));
MyOptions
の Account
だけを登録したい場合は以下のように記述します。
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;
}
}