91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ASP.NET Core修改配置文件后怎么自動加載更新

發布時間:2021-03-04 17:25:17 來源:億速云 閱讀:237 作者:TREX 欄目:開發技術

這篇文章主要講解了“ASP.NET Core修改配置文件后怎么自動加載更新”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“ASP.NET Core修改配置文件后怎么自動加載更新”吧!

前言

在 ASP.NET Core 默認的應用程序模板中, 配置文件的處理如下面的代碼所示:

config.AddJsonFile(
 path: "appsettings.json",
 optional: true,
 reloadOnChange: true
);
config.AddJsonFile(
 path: $"appsettings.{env.EnvironmentName}.json",
 optional: true,
 reloadOnChange: true
);

appsettings.json 和 appsettings.{env.EnvironmentName}.json 兩個配置文件都是可選的, 并且支持當文件被修改時能夠重新加載。

可以在 ASP.NET Core 應用中利用這個特性, 實現修改配置文件之后, 不需要重啟應用, 自動加載修改過的配置文件, 從而減少系統停機的時間。 實現的步驟如下:

使用配置 API 進行注入

假設要在程序中注入這樣一個配置類型:

public class WeatherOption {
 public string City { get; set; }
 public int RefreshInterval { get; set; }
}

在 appsettings.json 中添加的配置如下:

{
 "weather": {
 "city": "GuangZhou",
 "refreshInterval": 120
 }
}

在 Startup.cs 的 ConfigureServices 方法中使用配置 API 進行注入, 代碼如下:

public void ConfigureServices(IServiceCollection services) {
 services.Configure<WeatherOption>(Configuration.GetSection("weather"));
 services.AddControllers();
}

這個步驟很關鍵, 通過這個配置 API 可以把注入內容和配置所在的節點關聯起來。 如果有興趣了解底層實現的話, 可以繼續查看這個 OptionsConfigurationServiceCollectionExtensions.cs 。

通過這種方式注冊的內容, 都是支持當配置文件被修改時, 自動重新加載的。

在控制器 (Controller) 中加載修改過后的配置

控制器 (Controller) 在 ASP.NET Core 應用的依賴注入容器中注冊的生命周期是 Scoped , 即每次請求都會創建新的控制器實例。 這樣只需要在控制器的構造函數中注入 IOptionsSnapshot<TOption> 參數即可, 代碼如下:

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase {

 private WeatherOption option;

 public WeatherForecastController(
 IOptionsSnapshot<WeatherOption> options
 ) {
 this.option = options.Value;
 }

 // GET /weatherforcase/options
 [HttpGet("options")]
 public ActionResult<WeatherOption> GetOption() {
 return options;
 }
}

當然, 如果不希望在控制器中使用這個 IOptionsSnapshot 接口類型(會帶來一些對現有代碼重構和修改, 還是有一定的風險的), 可以在 ConfigureServices 中添加對 WeatherOption 的注入, 代碼如下:

public void ConfigureServices(IServiceCollection services) {
 services.Configure<WeatherOption>(Configuration.GetSection("weather"));
 // 添加對 WeatherOption 的注入, 生命周期為 Scoped , 這樣每次請求都可以獲取新的配置值。
 services.AddScoped(serviceProvider => {
 var snapshot = serviceProvider.GetService<IOptionsSnapshot<WeatherOption>>();
 return snapshot.Value;
 });
 services.AddControllers();
}

這樣在控制器中就不需要注入 IOptionsSnapshot<T> 類型了, 最終控制器的代碼如下:

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase {

 private WeatherOption option;

 public WeatherForecastController(
 WeatherOption option
 ) {
 this.option = option;
 }

 // GET /weatherforcase/options
 [HttpGet("options")]
 public ActionResult<WeatherOption> GetOption() {
 return options;
 }
}

這樣控制器就無需修改任何代碼即可加載修改過后的新配置。

在中間件 (Middleware) 中加載修改過后的配置

中間件 (Middleware) 在 ASP.NET Core 應用的依賴注入容器中注冊的生命周期是 Singleton , 即單例的, 只有在當應用啟動時, 根據中間件創建處理連時創建一次全局實例, 所以只能通過注入 IOptionsMonitor<T> 來監聽配置文件的修改情況, 示例代碼如下:

public class TestMiddleware {

 private RequestDelegate next;
 private WeatherOption option;

 public TestMiddleware(
 RequestDelegate next,
 IOptionsMonitor<WeatherOption> monitor
 ) {
 this.next = next;
 option = monitor.CurrentValue;
 // moni config change
 monitor.OnChange(newValue => {
  option = newValue;
 });
 }

 public async Task Invoke(HttpContext context) {
 await context.Response.WriteAsync(JsonSerializer.Serialize(option));
 }

}

當然, 在中間件的 Task Invoke(HttpContext context) 方法中, 直接獲取 IOptionsSnapshot<T> 也是可以的, 代碼如下:

public async Task Invoke(HttpContext context) {
 var snapshot = context.RequestServices.GetService<IOptionsSnapshot<WeatherOption>>();
 await context.Response.WriteAsync(JsonSerializer.Serialize(snapshot.Value));
}

但是這么做的話, 似乎就偏離了依賴注入的原則了, 因此不推薦這種做法。

總結

感謝各位的閱讀,以上就是“ASP.NET Core修改配置文件后怎么自動加載更新”的內容了,經過本文的學習后,相信大家對ASP.NET Core修改配置文件后怎么自動加載更新這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鄂托克旗| 秦皇岛市| 弋阳县| 辽源市| 防城港市| 东乡族自治县| 枞阳县| 阿鲁科尔沁旗| 衡山县| 康平县| 宜城市| 甘孜| 南投市| 瑞金市| 乡宁县| 五大连池市| 沙田区| 交口县| 邛崃市| 子洲县| 绿春县| 临朐县| 册亨县| 博湖县| 高陵县| 桃江县| 江都市| 曲沃县| 阿坝县| 永善县| 浠水县| 乌拉特后旗| 沙河市| 古浪县| 栾川县| 梁平县| 湟中县| 三都| 宿州市| 威远县| 怀安县|