2017-11-16

アプリケーション構成情報(appsettings.json)を読み取る方法

ASP.NET Core 2.0 でテンプレートを使ってプロジェクトを作成すると、 デフォルトでルート配下にappsettings.jsonファイルが配置されています。

このファイルは、アプリケーションを構成する設定情報(DB接続文字列やタイムアウトの時間、外部のURLなど)を定義するファイルで、 以前のweb.configファイルの<appSettings>セクションに該当するものになります。

appsettings.jsonファイルから設定情報を読み取る方法がいくつかあるようなので、 以下はその方法のメモです。

appsettings.json

今回、参照するappsettings.jsonの内容は以下の通りとします。

{
    "UserName": "ユーザー名",
    "Password": "パスワード",
    "App":{
        "Window":{
            "Width": 800,
            "Height": 600
        }
    }
}

GetValueで取得

一番シンプルな取得方法。


public class HomeController : Controller
{
    private readonly Configuration _configuration;

    public HomeController(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    public IActionResult Index()
    {
        var userName = _configuration.GetValue<string>("UserName");  // ユーザー名
        var password = _configuration.GetValue<string>("Password");  // パスワード
        return View();
    }
}

プロジェクトテンプレートを使った場合、Startupでとくになにも設定しなくても、 上記のようなコードでappsettings.jsonファイルに設定した内容を読み取ることができます。

ただ、毎回、文字列を指定して読み取るのは、変更があった際の修正が大変そうなので、 用意したクラスにバインドして利用するのが一般的かと思います。

クラスにバインドして取得

用意するクラスは以下の通り。


public class AppOptions
{
    public WindowOptions Window { get; set; }
}

public class WindowOptions
{
    public int Height { get; set; }
    public int Width { get; set; }
}

Startup.csを修正。


public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<AppOptions>(Configuration.GetSection("App"));     // 追加
        services.AddMvc();
    }
}

コントローラーで取得する場合。


public class HomeController : Controller
{
    private readonly IOptions<AppOptions> _appOptions;

    public HomeController(IOptions<AppOptions> appOptions)
    {
        _appOptions = appOptions;
    }

    public IActionResult Index()
    {
        var width = _appOptions.Value.Window.Width;     // 800
        var height = _appOptions.Value.Window.Height;   // 600
        return View();
    }
}

staticの共通メソッドから呼び出したい場合

staticの共通メソッドを使って取得したい場合は以下のようにします。


public class AppSettings
{
    public static IConfiguration Configuration { get; set; }

    public static string UserName { get { return Configuration.GetValue<string>("UserName"); } }
    public static string Password { get { return Configuration.GetValue<string>("Password"); } }
}

Startup.csを修正。


public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
        AppSettings.Configuration = configuration;      // 追加
    }
}

コントローラーで取得する場合。


public class HomeController : Controller
{
    public IActionResult Index()
    {
        var userName = AppSettings.UserName;    // ユーザー名
        var password = AppSettings.Password;    // パスワード
        return View();
    }
}

備考

ConfigurationのGetValue()を使うと毎回JSONファイルにアクセスするので、 パフォーマンス面から考えても最初に用意したクラスにバインドしてから取得するのがよさそうです。

参考リンク

ASP.NET Core」の記事

最新のプログラミング記事