ASP.NET Core MVC - オプションパターンで設定ファイルを読み込む
オプションパターンを使って設定ファイルから構成情報を読み込むサンプルです。
こちらを読みながら試しました。
ASP.NET Core のオプション パターン | Microsoft Docs
上記ドキュメントにもメリットが書いてありますが、平たく言ってしまうと「オプションパターンを使うと、設定を機能ごとにグルーピングしてわかりやすく管理できますよ」ってことかなと。
ということでコードを見ていきましょう。
次の設定ファイル(appsettings.json)をコントローラやビューで読み込んでみたいと思います。
// appsettings.json { "App": { // ある機能の設定だと思ってもらえると "Sample": { "Value1": 10, "Value2": 20 } // 他の機能の設定はここに足していく感じで } }
設定をバインドするクラス
まずはappsettings.jsonのSample
以下をバインドするクラスを用意します。
// appsettings.jsonのSample以下をバインドするクラス public class SampleSettings { public int Value1 { get; set; } public int Value2 { get; set; } }
設定をバインドできるようにする
設定を上記クラスにバインドできるように(DIで取得できるように)するために、オプションをサービスに登録します。
具体的にはStartup.ConfigureServicesメソッドを次のようにします。
public class Startup { private readonly IConfiguration _config; public Startup(IConfiguration config) { _config = config; } public void ConfigureServices(IServiceCollection services) { services.AddMvc(); // 設定をクラスにバインドできるようにする services.Configure<SampleSettings>(_config.GetSection("App:Sample")); // この書き方でもいいみたい //services.Configure<SampleSettings>(_config.GetSection("App").GetSection("Sample")); } // 略 }
コントローラで設定を参照する
コントローラで設定を参照してみましょう。
コンストラクタインジェクションでIOptions<TOptions>インターフェイスを指定すると、 SampleSettingsを取得できるようになります。
public class DefaultController : Controller { private readonly SampleSettings _settings; // DIでIOptions<SampleSettings>を取得 public DefaultController(IOptions<SampleSettings> options) { // IOptions.ValueプロパティからSampleSettingsを取得できる _settings = options.Value; } public IActionResult Index() { // 設定を参照できる Console.WriteLine($"{nameof(SampleSettings.Value1)}: {_settings.Value1}"); Console.WriteLine($"{nameof(SampleSettings.Value2)}: {_settings.Value2}"); // Value1: 10 // Value2: 20 return View(); } }
ビューで設定を参照する
ビューで設定を参照するには@inject
を使います。
@using Microsoft.Extensions.Options; @inject IOptionsSnapshot<SampleSettings> Options @{ var settings = Options.Value; @* 設定を参照できる *@ <div>@nameof(SampleSettings.Value1): @settings.Value1</div> <div>@nameof(SampleSettings.Value2): @settings.Value2</div> @* <div>Value1: 10</div> <div>Value2: 20</div> *@ }
設定を再読込する
IOptionsの代わりにIOptionsSnapshotを使うと、Webアプリケーション実行中に変更したappsettings.jsonの値を再読み込みできるようになります。
public class DefaultController : Controller { private readonly SampleSettings _settings; // IOptionsの代わりにIOptionsSnapshotを使うと再読み込みできる public DefaultController(IOptionsSnapshot<SampleSettings> options) { _settings = options.Value; } }
ドキュメントによると、リクエストごとに1回読み込んでキャッシュされるっぽいです。
ASP.NET Core 2.0 以降では、オプションは、要求の有効期間中にアクセスされ、キャッシュされたとき、要求につき 1 回計算されます。
おしまい。