1. ホーム
  2. Web プログラミング
  3. ASP.NET
  4. 実用的なヒント

再起動を伴わないNET5の設定変更は自動的に反映される

2022-01-14 12:46:10

.NET Core、.NET5のデフォルト構成は一度だけロードされ、構成を修正する場合、再起動しないと有効になりませんが、どうすれば瞬時に修正できるのか、そのデモを紹介します。

I. 設定ファイルをリアルタイムに反映させる設定

1.1 構成

Program.cs の CreateHostBuilder() で設定ファイルを読み込む際に reloadOnChange:true を追加する。

こうすることで、設定ファイルが変更されたとき、プログラムはファイルへの変更をリッスンし、自動的に再読み込みします。

 public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((context, config) =>
            {
                config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
            })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();

                });



1.2 バリデーション

appsettings.json ファイルの内容は次のとおりです。

{
  "TestSetting": "123",
  "AppOptions": {
    "UserName": "zhangsan"
  }
}


コード

 public class HomeController : Controller
    {
     private readonly ILogger<HomeController> _logger;
        private readonly IConfiguration _configuration;
        public HomeController(ILogger<HomeController> logger, IConfiguration configuration)
        {
            _logger = logger;
            _configuration = configuration;
        }

        public IActionResult Index()
        {
            string Name = _configuration["TestSetting"];
            string Name2 = _configuration["AppOptions:UserName"];
            ViewBag.Name = Name;
            ViewBag.Name2 = Name2;
            return View();
        }
}



インターフェイスが表示されます。

 設定ファイルを次のように変更します。

{
  "TestSetting": "abc",
  "AppOptions": {
    "UserName": "zhangsan123"
  }
}


ページが変更されたので、更新する。

1.3 IOptionsのアプローチはリアルタイムで効果を発揮する

AppOptions.cs クラスを新規に作成します。

/// <summary>
    //// Configuration file
    /// </summary>
    public class AppOptions
    {
        public string UserName { get; set; }
    }


Startup.csのOptionsに設定を追加します。

  public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();
            services.Configure<AppOptions>(Configuration.GetSection("AppOptions"));
        }


使用すること。

public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        private readonly IConfiguration _configuration;
        private AppOptions _options;
        public HomeController(ILogger<HomeController> logger, IConfiguration configuration, IOptionsMonitor<AppOptions> appOptions)
        {
            _logger = logger;
            _configuration = configuration;
            _options = appOptions.CurrentValue;
        }

        public IActionResult Index()
        {
            string Name = _configuration["TestSetting"];
            string Name2 = _options.UserName;
            ViewBag.Name = Name;
            ViewBag.Name2 = Name2;
            return View();
        }
}



IOptionsには3つの方法があります。

//IOptions<T> //The value obtained after the site is started is always the same
//IOptionsMonitor<T> //If the configuration file changes after the site is started, an event will be posted (reloadOnChange:true must be true when loading the configuration)
//IOptionsSnapshot<T> //After the site is started, each time the value obtained is the latest value in the configuration file (reloadOnChange:true must be true when loading the configuration)


注意事項

AddSingleton Services で IOptionsMonitor<T> を使用しても、設定をすぐに有効にすることはできず、IOptionsSnapshot<T> は起動時にエラーを報告するようになりました。

 public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        private UserService _userService;
        public HomeController(ILogger<HomeController> logger, UserService userService)
        {
           
            _userService = userService;
        }

        public IActionResult Index()
        {
            string Name2 = _userService.GetName();
            ViewBag.Name2 = Name2;
            return View();
        }
}


public class UserService
    {
        private AppOptions _options;
        public UserService(IOptionsMonitor<AppOptions> appOptions)
        {
            _options = appOptions.CurrentValue;
        }
        public string GetName()
        {
            var Name = _options.UserName;
            return Name;
        }
    }



 public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();
            services.Configure<AppOptions>(Configuration.GetSection("AppOptions"));
            services.AddSingleton<UserService>();
        }

上記のUserServiceはシングルインスタンスで注入されており、1.2では_configuration["AppOptions:UserName"]によってのみ取得できるIOptionsによって設定がリアルタイムにリフレッシュされるわけではありません。

そのため、これらのメソッドは、シナリオによって使い分ける必要があります。

1.4 複数プロファイルの読み込みがリアルタイムで有効になる

dbプロファイルを追加する

Program.cs の CreateHostBuilder() を修正し、読み込み時に reloadOnChange:true を追加すれば完了です。

  public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((context, config) =>
            {
                config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
                config.AddJsonFile("Configs/dbsetting.json", optional: true, reloadOnChange: true);
            })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();

                });


を使用する。

 public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        private readonly IConfiguration _configuration;
        private AppOptions _options;
        public HomeController(ILogger<HomeController> logger, IConfiguration configuration, IOptionsMonitor<AppOptions> appOptions)
        {
            _logger = logger;
            _configuration = configuration;
            _options = appOptions.CurrentValue;
        }

        public IActionResult Index()
        {
            string Name = _configuration["TestSetting"];
            string Name2 = _configuration["db:connection1"];
            ViewBag.Name = Name;
            ViewBag.Name2 = Name2;
            return View();
        }
}

.NET5 自動的に再起動しない設定変更についてはこちらをご覧ください。