亚洲精品亚洲人成在线观看麻豆,在线欧美视频一区,亚洲国产精品一区二区动图,色综合久久丁香婷婷

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

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

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

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

              1.1配置

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

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



              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修改配置不重啟自動(dòng)生效_json

              ?

              ?

              ?把配置文件修改為:



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


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

              .NET5修改配置不重啟自動(dòng)生效_.NetCore_02

              ?

              ?

              ?

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

              新建AppOptions.cs類(lèi)



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


              注意:?

              IOptionsMonitor<T> 和 IOptionsSnapshot<T> 的最大區(qū)別是前者可以被其他的Singleton Services使用而后者不可以, 因?yàn)榍罢弑蛔?cè)為Singleton 而后者是被注冊(cè)為Scoped,也就是說(shuō)文件被修改了前者會(huì)立即Reload,而后者是在每個(gè)請(qǐng)求才被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是單例注入的,通過(guò)IOptionsMonitor<T>的方式是可以實(shí)現(xiàn)配置實(shí)時(shí)刷新的,而IOptionsSnapshot<T>啟動(dòng)就會(huì)報(bào)錯(cuò)。

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

              增加多一個(gè)db配置文件

              .NET5修改配置不重啟自動(dòng)生效_.NetCore_03

              ?

              ?

              修改Program.cs處CreateHostBuilder(),也是加載時(shí)加上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

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