當(dāng)前位置:首頁 > IT技術(shù) > Web編程 > 正文

.NET5修改配置不重啟自動生效
2021-10-22 09:56:49

.NET Core,.NET5默認(rèn)配置都是只加載一次,修改配置時都需要重啟才能生效,如何能修改即時生效呢,下面來演示一遍。

一、設(shè)置配置文件實(shí)時生效

1.1配置

在Program.cs的CreateHostBuilder()處增加加載配置文件的時候,reloadOnChange:true。

這樣配置文件修改的時候,程序就會監(jiān)聽到文件發(fā)生變化,自動重新加載了。



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驗(yàn)證

appsettings.json文件內(nèi)容如下



{
"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();
}
}


?

界面顯示:

.NET5修改配置不重啟自動生效_json

?

?

?把配置文件修改為:



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


刷新頁面,已經(jīng)發(fā)生變化:

.NET5修改配置不重啟自動生效_.NetCore_02

?

?

?

1.3 IOptions方式實(shí)時生效

新建AppOptions.cs類



/// <summary>
/// 配置文件
/// </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 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有三種方式



//IOptions<T> //站點(diǎn)啟動后,獲取到的值永遠(yuǎn)不變
//IOptionsMonitor<T> //站點(diǎn)啟動后,如果配置文件有變化會發(fā)布事件 (加載配置時,reloadOnChange:true 必須為true)
//IOptionsSnapshot<T> //站點(diǎn)啟動后,每次獲取到的值都是配置文件里的最新值 (加載配置時,reloadOnChange:true 必須為true)


注意:?

IOptionsMonitor<T> 和 IOptionsSnapshot<T> 的最大區(qū)別是前者可以被其他的Singleton Services使用而后者不可以, 因?yàn)榍罢弑蛔詾镾ingleton 而后者是被注冊為Scoped,也就是說文件被修改了前者會立即Reload,而后者是在每個請求才被Reload。

例:



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>();
}


上面的UserService是單例注入的,通過IOptionsMonitor<T>的方式是可以實(shí)現(xiàn)配置實(shí)時刷新的,而IOptionsSnapshot<T>啟動就會報錯。

1.4多個配置文件加載實(shí)時生效

增加多一個db配置文件

.NET5修改配置不重啟自動生效_.NetCore_03

?

?

修改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();
}
}


?

本文摘自 :https://blog.51cto.com/u

開通會員,享受整站包年服務(wù)立即開通 >