ASP.NET Core MVC - オプションパターンで設定ファイルを読み込む

オプションパターンを使って設定ファイルから構成情報を読み込むサンプルです。

こちらを読みながら試しました。

ASP.NET Core のオプション パターン | Microsoft Docs

上記ドキュメントにもメリットが書いてありますが、平たく言ってしまうと「オプションパターンを使うと、設定を機能ごとにグルーピングしてわかりやすく管理できますよ」ってことかなと。

ということでコードを見ていきましょう。

次の設定ファイル(appsettings.json)をコントローラやビューで読み込んでみたいと思います。

// appsettings.json
{
    "App": {
        // ある機能の設定だと思ってもらえると
        "Sample": {
            "Value1": 10,
            "Value2": 20
        }
        // 他の機能の設定はここに足していく感じで
    }
}

設定をバインドするクラス

まずはappsettings.jsonSample以下をバインドするクラスを用意します。

// 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 回計算されます。

引用元

おしまい。