日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET Core开发实战(第14课:自定义配置数据源:低成本实现定制化配置方案)--学习笔记...

發布時間:2023/12/4 asp.net 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET Core开发实战(第14课:自定义配置数据源:低成本实现定制化配置方案)--学习笔记... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

14 | 自定義配置數據源:低成本實現定制化配置方案

這一節講解如何定義自己的數據源,來擴展配置框架

擴展步驟

1、實現 IConfigurationSource

2、實現 IConfigurationProvider

3、實現 AddXXX 擴展方法,用來作為注入的快捷方式

源碼鏈接:
https://github.com/witskeeper/geektime/tree/master/samples/ConfigurationCustom

首先定義一個 MyConfigurationSource

namespace ConfigurationCustom {class MyConfigurationSource : IConfigurationSource{public IConfigurationProvider Build(IConfigurationBuilder builder){return new MyConfigurationProvider();}} }

接著是 MyConfigurationProvider

namespace ConfigurationCustom {// ConfigurationProvider 集成自 IConfigurationProviderclass MyConfigurationProvider : ConfigurationProvider{Timer timer;public MyConfigurationProvider() : base(){// 用一個線程模擬配置發生變化,每三秒鐘執行一次,告訴我們要重新加載配置timer = new Timer();timer.Elapsed += Timer_Elapsed;timer.Interval = 3000;timer.Start();}private void Timer_Elapsed(object sender, ElapsedEventArgs e) => Load(true);public override void Load() => Load(false);/// <summary>/// 加載數據/// </summary>/// <param name="reload">是否重新加載數據</param>void Load(bool reload){// Data 表示 Key-value 數據,這是由 ConfigurationProvider 提供的一個數據承載的集合// 我們把最新的時間填充進去Data["lastTime"] = DateTime.Now.ToString();if (reload){base.OnReload();}}} }

實際上到此擴展就已經完成了,可以通過 builder.AddXXX 這個方法來把 source 注入進來

namespace ConfigurationCustom {class Program{static void Main(string[] args){var builder = new ConfigurationBuilder();builder.Add(new MyConfigurationSource());var configRoot = builder.Build();Console.WriteLine($"lastTime:{configRoot["lastTime"]}");Console.ReadKey();}} }

啟動程序,輸出如下:

lastTime:2020/3/1 22:39:36

這里可以看到,輸出最新的時間

但是如果這樣去分發配置源的包的話,需要把 MyConfigurationSource
定義為 public,否則使用方式沒辦法引用到這個類

那么就可以通過擴展方法的方式來保障不需要暴露 ConfigSource

定義一個擴展方法 AddMyConfiguration

namespace Microsoft.Extensions.Configuration {public static class MyConfigurationBuilderExtensions{public static IConfigurationBuilder AddMyConfiguration(this IConfigurationBuilder builder){builder.Add(new MyConfigurationSource());return builder;}} }

首先把擴展方法的命名空間放在 config 的命名空間,而不是自己的命名空間,這樣方便在引用的時候直接使用而無需加載具體的命名空間

另外一個可以把 Provider 定義為 internal 的,默認是 internal,如果說分發到第三方的話,internal 的類是不能被引用的,這樣就意味著只需要暴露一個擴展方法,而不需要暴露具體的配置源的實現

class MyConfigurationProvider : ConfigurationProvider

如何使用呢,其實很簡單

只需要在 builder.Add 的時候使用 builder.AddMyConfiguration 就可以了,這樣達到的效果是一樣的

namespace ConfigurationCustom {class Program{static void Main(string[] args){var builder = new ConfigurationBuilder();//builder.Add(new MyConfigurationSource());builder.AddMyConfiguration();var configRoot = builder.Build();Console.WriteLine($"lastTime:{configRoot["lastTime"]}");Console.ReadKey();}} }

啟動程序,輸出如下:

lastTime:2020/3/1 22:55:11

在定義擴展的時候,都推薦這樣去做,把具體實現都定義為私有的,然后通過擴展方法的方式暴露出去

剛才實際上還定義了一個 timer 來模擬配置的變更,這里可以監聽一下它的變更,看是否生效

上一節講到 ChangeToken 的方式,這里還是用 ChangeToken 的 OnChange 方法

namespace ConfigurationCustom {class Program{static void Main(string[] args){var builder = new ConfigurationBuilder();builder.AddMyConfiguration();var configRoot = builder.Build();ChangeToken.OnChange(() => configRoot.GetReloadToken(), () =>{Console.WriteLine($"lastTime:{configRoot["lastTime"]}");});Console.WriteLine("開始了");Console.ReadKey();}} }

啟動程序,輸出如下:

開始了 lastTime:2020/3/1 22:59:25 lastTime:2020/3/1 22:59:28 lastTime:2020/3/1 22:59:31

每個三秒鐘輸出一次,這說明我們定義的配置變更的通知已經生效了

MyConfigurationProvider 中我們只是通過賦值一個 DateTime 來模擬配置源

實際上可以從遠程來說,比如阿波羅的配置中心,Kazoo,這些地方遠程的讀取配置,結合著命令行和環境變量配置,就可以完成配置中心的遠程方案,意味著可以版本化的管理配置

這樣子在 Docker 容器環境下面,Kubernetes 環境下面,就可以有完善的配置管理解決方案

總結

以上是生活随笔為你收集整理的.NET Core开发实战(第14课:自定义配置数据源:低成本实现定制化配置方案)--学习笔记...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。