ASP.NET Core 3.1 MVC における構成ファイル appsettings.json からの値取得 

# はじめに

以前の以下の投稿で、.NET Core 1.1 での ASP.NET Core において appsettings.json からの値取得の方法を説明しました。

- [ASP.NET Core MVC における構成ファイル appsettings.json からの値取得](https://qiita.com/hiromasa-masuda/items/d7e33b20d3eedee771f4)

今回は、.NET Core 3.1 での ASP.NET Core において、appsettings.json からの値取得の方法を説明します。
基本的な方法はほとんど同じです。

# appsettings.json の定義

appsettings.json を以下のように定義したとします。

```json:appsettings.json
{
  "UserSettings": {
    "IsDemoMode": false,
    "DefaultUser": {
      "Name": "足利 義教",
      "Age": 48
    }
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  }
}
```

# IConfiguration での構成情報の取得

何もしなくても構成情報は、依存性の注入がされているので、コントローラーから、構成情報を IConfiguration で取得できます。

```csharp:HomeController.cs

public class HomeController : Controller
{
    private readonly IConfiguration _configuration;
    private readonly ILogger<HomeController> _logger;
    

    public HomeController(IConfiguration configuration, ILogger<HomeController> logger)
    {
            this._configuration = configuration;            
            this._logger = logger;
    }

    public IActionResult Index()
    {   
        //ブール値のロード
        bool isDemoMode = this._configuration.GetValue<bool>("UserSettings:IsDemoMode");
        //文字列値のロードは、インデクサで指定可能
        string defaultUserName = this._configuration["UserSettings:DefaultUser:Name"];
        //int 値のロード
        int defaultUserAge = this._configuration.GetValue<int>("UserSettings:DefaultUser:Age");

        return View((isDemoMode, defaultUserName, defaultUserAge));
    }

    ...
}
```

# オプション パターンでの構成情報の取得

前回の記事でも触れましたが、構成情報をクラスにバインドして、そこから取得した方が可読性があがりますね。

JSON の定義に対応するクラスを定義します。
前回も説明しましたが、Visual Studio からクラス ファイルを追加し、JSON ファイルの文字列をコピーして、[編集] - [形式を選択して貼り付け] - [JSON をクラスとして貼り付ける] を選択すると、クラスの定義をペースト出来るので便利です。

```csharp:UserSettings.cs

    public class UserSettings
    {
        public bool IsDemoMode { get; set; }
        public DefaultUser DefaultUser { get; set; }
    }

    public class DefaultUser
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

```
次に、StartUp.ConfigureServices からサービス コレクション経由で構成情報を注入します。


```csharp:Startup.cs

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

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        //構成情報の注入
        services.Configure<UserSettings>(this.Configuration.GetSection("UserSettings"));
        services.AddControllersWithViews();            
    }

    ...
}

```

これで、コントローラーから、注入した構成情報を取得できます。

```csharp:HomeController.cs

public class HomeController : Controller
{
    private readonly UserSettings _userSettings;

    private readonly ILogger<HomeController> _logger;        

    public HomeController(IOptions<UserSettings> userSettings, ILogger<HomeController> logger)
    {
        //構成情報の取得
        this._userSettings = userSettings.Value;
        this._logger = logger;
    }

    public IActionResult Index()
    {
        //構成情報の参照
        return View(this._userSettings);
    }

    ...
}
```

固有のクラス経由で構成情報を取得した方が、やはり可読性があがりますね。

#参考サイト
- [Configuration in ASP.NET Core](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/)
- [Dependency injection in ASP.NET Core](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection)