一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - ASP.NET教程 - ASP.NET Core - 選項系統(tǒng)之選項使用

ASP.NET Core - 選項系統(tǒng)之選項使用

2023-05-08 00:06未知服務(wù)器之家 ASP.NET教程

上一篇 ASP.NET Core - 選項系統(tǒng)之選項配置 中提到 IOptions 、IOptionsMonitor 和 IOptionsSnapshot 三個接口,通過這三個接口都可以從依賴注入容器中解析出已經(jīng)配置的選項類,在我們通過 Configure 方法配置選項時,這三個接口會被同時注冊,

上一篇 ASP.NET Core - 選項系統(tǒng)之選項配置 中提到 IOptions、IOptionsMonitor 和 IOptionsSnapshot 三個接口,通過這三個接口都可以從依賴注入容器中解析出已經(jīng)配置的選項類,在我們通過 Configure 方法配置選項時,這三個接口會被同時注冊,但三個接口是有區(qū)別的,適用場景也有所不同。

1. IOptions

  • IOptions 對象的生命周期是 Singleton (單例),它可以在任意地方進行注入使用
  • 該接口對象在第一次使用的時候被實例化,并且選項類中的內(nèi)容會一直保持不變,前面也提過選項類內(nèi)容可以在配置來源修改之后更新,但是通過 IOption 解析的選項類不會隨著更新而改變
  • IOptions 接口不支持命名選項模式,它是沒有 get 方法的,也并不會默認讀取第一個,它只能讀取 String.Empty 默認命名的選項,如果沒有配置默認選項的話,雖然也能解析出 Options 選項類對象,但是對象的屬性都是相應(yīng)類型的默認值(引用類型是 null,值類型是 0,其他的也都是相應(yīng)類型的默認值)
public class OptionController : ControllerBase
{
	private readonly BlogOptions _blogOptions;
	public OptionController(IOptions<BlogOptions> options)
	{
		// 通過 IOptions<TOptions> 接口的 Value 屬性讀取選項類
		// 選項類始終是程序啟動時加載的值,不會改變
		_blogOptions = options.Value;
	}
}

2. IOptionsMonitor

  • IOptionsMonitor 對象的生命周期是 Scoped(作用域),Scoped 生命周期的特點是不能注入到 Singleton 服務(wù)中
  • 在作用域中(最常見的一次Http請求),創(chuàng)建 IOptionsSnapshot 對象實例時,會從配置中讀取最新選項值作為快照,并在當前作用域中始終使用該快照。也就是說一次請求中選項類內(nèi)容保持不變,但是不同請求中可能因為配置來源的修改而不同
  • IOptionsMonitor 支持命名選項
public class OptionController : ControllerBase
{
	private readonly BlogOptions _blogOptions;
	public OptionController(IOptionsSnapshot<BlogOptions> optionsSnapshot)
	{
		// IOptionsSnapshot<TOptions> 可以通過 Value 屬性讀取默認的命名的選項類, Options 對象實例創(chuàng)建時讀取的配置快照
		_blogOptions = optionsSnapshot.Value;
		// 也可以通過 Get 方法獲取某一個命名選項,沒有指定命名時,默認命名為 string.Empty
		//_blogOptions = optionsSnapshot.Get(string.Empty);
	}
}

3. IOptionsSnapshot

  • IOptionsSnapshot 對象的生命周期也是 Singleton (單例)
  • 通過 IOptionsSnapshot 接口注入的對象每次讀取選項值時,都是從配置中讀取最新選項值,能夠?qū)崟r獲取配置來源的更改
  • 該接口支持命名選項模式
  • 除了可以查看 TOptions 的值,還可以監(jiān)控 TOptions 配置的更改,支持重新加載配置(CurrentValue),并當配置發(fā)生更改時,進行通知(OnChange),支持緩存與緩存失效 (IOptionsMonitorCache),每次調(diào)用實例的 CurrentValue 時,會先檢查緩存(IOptionsMonitorCache)是否有值,如果有值,則直接用,如果沒有,則從配置中讀取最新選項值,并記入緩存。當配置發(fā)生更改時,會將緩存清空。
public class OptionController : ControllerBase
{
	private readonly BlogOptions _blogOptions;
	public OptionController(IOptionsMonitor<BlogOptions> optionsMonitor)
	{
		// IOptionsMonitor<TOptions> 接口沒有 Value 屬性,通過 CurrentValue 獲取選項類對象,
		// 每次調(diào)用 CurrentValue都會實時讀取配置源,始終是最新配置的值
		_blogOptions = optionsMonitor.CurrentValue;
		// 該接口也支持通過 Get 方法獲取命名選項
		_blogOptions = optionsMonitor.Get(string.Empty);
		// 可以通過 OnChange 注冊事件,當配置被加載時會觸發(fā)事件
		optionsMonitor.OnChange(OnOptionsChange);
	}

	[HttpGet]
	public Task<BlogOptions> Get()
	{
		return Task.FromResult(_blogOptions);
	}

	private void OnOptionsChange(BlogOptions options)
	{
		Console.WriteLine(JsonSerializer.Serialize(options));
	}
}

啟動應(yīng)用,調(diào)用一次 Get 接口,在 Api 控制器構(gòu)造函數(shù)中注冊了配置加載觸發(fā)事件,之后修改 appsettings.json 配置文件中選項類對于的配置節(jié)點內(nèi)容,可以看到事件觸發(fā),控制臺中輸出了改變之后的選項類內(nèi)容。

ASP.NET Core - 選項系統(tǒng)之選項使用

4. 三個接口的選項讀取機制演示

三個接口解析的選項類的差別,可以通過以下測試清楚得看出:

配置文件中初始選項節(jié)點如下:

"Blog": {
    "Title": "ASP.NET Core Options11",
    "Content": "This is a blog about Options System in ASP.NET Core Framework.",
    "CreateTime": "2022-12-06"
}

這里為了方便看出 Scoped 生命周期 IOptionSnapeshoot 接口的變化,所有通過 Web Api 接口來測試

public class OptionController : ControllerBase
{
	private readonly IOptions<BlogOptions> _blogOptions;
	private readonly IOptionsSnapshot<BlogOptions> _blogSnapshotOptions;
	private readonly IOptionsMonitor<BlogOptions> _blogMonitorOptions;
	public OptionController(
		 IOptions<BlogOptions> options,
		IOptionsSnapshot<BlogOptions> optionsSnapshot,
		IOptionsMonitor<BlogOptions> optionsMonitor
		)
	{
// 注意這里不能再把選項類對象先讀取出來,否則選項類對象也不會再改變了
		_blogOptions = options;
		_blogSnapshotOptions = optionsSnapshot;
		_blogMonitorOptions = optionsMonitor;
	}

	[HttpGet]
	public Task Get()
	{
		Console.WriteLine("第一次讀取配置:");
		Console.WriteLine("IOptions<TOptions>:" + JsonSerializer.Serialize(_blogOptions.Value));
		Console.WriteLine("IOptionsSnapshot<TOptions>:" + JsonSerializer.Serialize(_blogSnapshotOptions.Value));
		Console.WriteLine("IOptionsMonitor<TOptions>:" + JsonSerializer.Serialize(_blogMonitorOptions.CurrentValue));

		Console.WriteLine("請修改配置文件!");
		Console.ReadKey();

		Console.WriteLine("第二次讀取配置:");
		Console.WriteLine("IOptions<TOptions>:" + JsonSerializer.Serialize(_blogOptions.Value));
		Console.WriteLine("IOptionsSnapshot<TOptions>:" + JsonSerializer.Serialize(_blogSnapshotOptions.Value));
		Console.WriteLine("IOptionsMonitor<TOptions>:" + JsonSerializer.Serialize(_blogMonitorOptions.CurrentValue));

		return Task.CompletedTask;
	}
}

之后啟動應(yīng)用調(diào)用 Get 接口,并在過程中將配置文件內(nèi)容修改為以下:

"Blog": {
    "Title": "ASP.NET Core Options222",
    "Content": "This is a blog about Options System in ASP.NET Core Framework.",
    "CreateTime": "2022-12-06"
}

可以看到控制臺的輸出中,第二次讀取配置的時候,IOptionsMonitor 接口讀取到的內(nèi)容已經(jīng)改變

ASP.NET Core - 選項系統(tǒng)之選項使用

之后不要關(guān)閉應(yīng)用,再調(diào)一次 Get 接口,并在過程中再次修改配置如下:

"Blog": {
    "Title": "ASP.NET Core Options333",
    "Content": "This is a blog about Options System in ASP.NET Core Framework.",
    "CreateTime": "2022-12-06"
}

這一次的 Get 請求的輸出結(jié)果如下:
ASP.NET Core - 選項系統(tǒng)之選項使用

可以看到 IOptionsMonitor 接口每次都能獲取到配置文件的實時值,IOptionsSnapshot 接口相較于第一次調(diào)用 Get 接口的時候已經(jīng)改變,獲取到了之前修改的值,但是之后的修改它又獲取不到了,因為它是 Scoped 生命周期,在一次請求內(nèi)是保持一致的,而 IOptions 接口獲取到的選項類對象是一致不變的。



參考文章:
ASP.NET Core 中的選項模式 | Microsoft Learn
選項模式 - .NET | Microsoft Learn
面向 .NET 庫創(chuàng)建者的選項模式指南 - .NET | Microsoft Learn
理解ASP.NET Core - 選項(Options)



ASP.NET Core 系列:

目錄:ASP.NET Core 系列總結(jié)
上一篇:ASP.NET Core - 選項系統(tǒng)之選項配置

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产日日干| 91天堂国产在线 在线播放 | 久久中文电影 | 青青青手机视频 | 婷婷久久综合九色综合九七 | 小早川怜子亚洲综合中文字幕 | 国产一卡2卡3卡四卡精品网 | 91精品啪在线观看国产线免费 | 国产成人愉拍免费视频 | 亚洲精品视频网 | xxxxx性13一14 | 女女性恋爱视频入口 | 国产二区视频 | 国产精品欧美韩国日本久久 | 婷婷色综合网 | 日本九九视频 | 欧美同志video 在线观看 | 91日本在线观看亚洲精品 | 国产永久免费视频m3u8 | 操尼姑| 亚洲第一福利视频 | 精品综合久久久久久97超人 | 69福利区| 免费一区视频 | 亚洲黄色大片 | av72成人 | 天堂网在线.www天堂在线视频 | 王晶三级作品 | pppd在线播放 | 日本大片免a费观看在线 | 色中文网 | 91私密保健女子养生spa | 国产精品久久久久久岛国 | 国产精品永久免费视频 | 国产二区视频在线观看 | 国模丰满美女冰漪34d | 国产成年人在线观看 | 亚洲日本中文字幕在线2022 | 国产精品中文 | h片免费网站 | 特级夫妻大片免费在线播放 |