1.リアルタイムで有効になるプロファイルの設定
1.1構成
am.
設定ファイルが変更されると、プログラムはファイルの変更をリッスンし、自動的にリロードします。
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>
/// 配置文件
/// </summary>
public class AppOptions
{
public string UserName { get; set; }
}
Startup.csでオプションに設定を追加する
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 IOptionsMonitor<AppOptions> _options;
public HomeController(ILogger<HomeController> logger, IConfiguration configuration, IOptionsMonitor<AppOptions> appOptions)
{
_logger = logger;
_configuration = configuration;
_options = appOptions;
}
public IActionResult Index()
{
string Name = _configuration["TestSetting"];
string Name2 = _options.CurrentValue.UserName;
ViewBag.Name = Name;
ViewBag.Name2 = Name2;
return View();
}
}
IOptionsは3つの方法
1. IOptions<T> //站点启动后,获取到的值永远不变
2. IOptionsMonitor<T> //站点启动后,如果配置文件有变化会发布事件 (加载配置时,reloadOnChange:true 必须为true)
3. IOptionsSnapshot<T> //站点启动后,每次获取到的值都是配置文件里的最新值 (加载配置时,reloadOnChange:true 必须为true)
** ご注意:**
IOptionsMonitor TとIOptionsSnapshot Tの最大の違いは、前者は他のシングルトンサービスで使用できますが、後者は使用できません。前者はシングルトンとして登録され、後者はScopedとして登録されます。つまり、ファイルが変更されると、前者は即座に再ロードされますが、後者はリクエストごとに再ロードされます。
例として:
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 IOptionsMonitor<AppOptions> _options;
public UserService(IOptionsMonitor<AppOptions> appOptions)
{
_options = appOptions;
}
public string GetName()
{
var Name = _options.CurrentValue.UserName;
return Name;
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.Configure<AppOptions>(Configuration.GetSection("AppOptions"));
services.AddSingleton<UserService>();
}
上記のUser Serviceはシングルトン注入であり、IOptionsMonitor Tを介して設定リアルタイムリフレッシュを実現することができ、IOptionsSnapshot Tが起動するとエラーが発生します。
1.4複数のプロファイル·ロードがリアルタイムに有効になる
dbプロファイルを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);
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();
}
}