.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 环境下面,就可以有完善的配置管理解决方案

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uml类图例子_转:(中文命名)UML类图新手入门级介绍

下文转于 2019-05-10。2020-03-10 发觉本出自2007 年出版的《大话设计模式》一书&#xff08;作者: 程杰&#xff09;第一章。于是将文末原链接删去。转载注&#xff1a; 中文命名的优势在UML图这样专注业务逻辑且完全符号化语法&#xff08;与英语无关&#xff09;的工具中特别…

API是什么

定义: API 是用于构建应用程序软件的一组子程序定义&#xff0c;协议和工具。一般来说&#xff0c;这是一套明确定义的各种软件组件之间的通信方法。 接口interface: 各个组件发生交互的区域 协议protocol: 规定了各部分之间如何进行交流的一系列规则的集合 格式format: …

瓷砖铺放-dfs

题目描述 有一长度为N(1< &#xff2e;< 10)的地板&#xff0c;给定两种不同瓷砖&#xff1a;一种长度为1&#xff0c;另一种长度为2&#xff0c;数目不限。要将这个长度为N的地板铺满&#xff0c;一共有多少种不同的铺法&#xff1f; 例如&#xff0c;长度为4的地面一共…

2020年学python_Python学习路线图(2020年最新版)

PythonPython开发Python语言Python学习路线图(2020年最新版)这是我刚开始学习python时的一套学习路线&#xff0c;从入门到上手。(不敢说精通&#xff0c;哈哈~)希望对大家有帮助哈~一、Python入门、环境搭建、变量、数据类型二、Python运算符、条件结构、循环结构三、Python函…

开源、免费、企业级的SiteServer CMS .NET CORE 7.0 预览版发布

经过连续不断地开发与完善&#xff0c;SiteServer CMS .NET CORE 版本终于在今天与大家见面了&#xff0c;版本为7.0.0-preview1&#xff0c;我们将在未来几个月收集大家的反馈&#xff0c;修复与完善产品&#xff0c;最终发布能够稳定运行的7.0正式版。基于.NET CORE的跨平台性…

equals, hashCode, toString方法重写,深入探究equals

首先是超类Employee: package chapter5_inheritance.equals;import java.time.LocalDate; import java.util.Objects;public class Employee {private String name;private double salary;private LocalDate hireDay;public Employee(String name, double salary, int year, i…

UVA - 839 Not so Mobile

输入一个树状天平&#xff0c;根据力矩相等原则判断是否平衡。如图所示&#xff0c;所谓力矩相等&#xff0c;就是Wl DlWr Dr,其中Wl和Wr分别为左右两边砝码的重量&#xff0c;D为距离。 采用递归&#xff08;先序&#xff09;方式输入&#xff1a;每个天平的格式为Wl ,Dl,Wr,…

.NET Core 3.0 即将结束生命周期,建议迁移 3.1

.NET Core 官方发布博客&#xff0c;说明 .NET Core 3.0 即将结束生命周期&#xff0c;建议开发者迁移到 3.1 版本。.NET Core 3.0 于 2019 年 12 月 3 日发布&#xff0c;这是一个 Current 版本而不是 LTS 版本&#xff0c;将于今年 3 月 3 日 EOL&#xff08;End of Life&…

CoreJava 笔记总结-第三章 Java的基本程序设计结构

CoreJava 笔记总结 文章目录CoreJava 笔记总结第三章 Java的基本程序设计结构数据类型1. 整型2. 浮点类型3. char类型4. boolean类型变量与常量1. 变量2. 常量3. 枚举类型运算符关系和boolean运算符数学函数与常量强制类型转换字符串空串与null串码点与代码单元构建字符串输入与…

python高级编程知识点_(转)python 高级编程技巧学习笔记

转自https://www.jianshu.com/p/104cec085611&#xff0c;部分图出不来&#xff0c;mark一下&#xff0c;关键时候供查看。第二章 数据结构相关话题2.1、筛选数据两种方式filter函数&#xff1a;filter(lambda x: x>0, data)注意&#xff1a;python3 需要把filter的结果转为…

.NET Core开发实战(第15课:选项框架:服务组件集成配置的最佳实践)--学习笔记...

15 | 选项框架&#xff1a;服务组件集成配置的最佳实践这一节讲解如何使用选项框架来处理服务和配置的关系选项框架的特性&#xff1a;1、支持单例模式读取配置2、支持快照3、支持配置变更通知4、支持运行时动态修改选项值在设计系统的时候需要遵循两个原则&#xff1a;1、接口…

UVA - 572 Oil Deposits-dfs找连通块

Discription 给定一个包含 *的二维数组&#xff0c;输出有几个是联通的&#xff0c;如果一个在另外一个相邻的八个方向则视作相邻。 Input 包含 *的二维数组。 Output 输出联通的个数 解题思路&#xff1a; 从每一个格子出发&#xff0c;递归遍历它周围的格子&#xff0c;每次…

HTMLCSS 超简单的前端设计入门-1!

第一个网页 文章目录第一个网页注释元素(标签,标记)元素的嵌套标准的文档结构语义化什么是语义化为什么需要语义化?文本元素hpspanpreHTML 实体a元素href 属性target属性路径的写法站内内资源和站外资源绝对路径和相对路径Emmet 注释 注释不参与运行 书写方式(html) <!-…

【朝夕技术专刊】WebApi部署多服务器配置Nginx负载均衡

欢迎大家阅读《朝夕Net社区技术专刊》第3期我们致力于.NetCore的推广和落地&#xff0c;为更好的帮助大家学习&#xff0c;方便分享干货&#xff0c;特创此刊&#xff01;很高兴你能成为首期读者&#xff0c;文末福利不要错过哦&#xff01;01PARTCoreWebApi教程本地演示环境Vi…

sprintf()函数的使用

sprintf&#xff08;&#xff09;&#xff1a; 函数功能&#xff1a;把格式化的数据写入某个字符串 函数原型&#xff1a;int sprintf( char buffer, const char format [, argument] … ); 返回值&#xff1a;字符串长度&#xff08;strlen&#xff09; 例子&#xff1a; cha…

CoreJava 笔记总结-第四章 对象与类

文章目录第四章 对象与类使用预定义类对象与对象变量Java库中的LocalDate类更改器方法和访问器方法用户自定义类用var声明局部变量使用null引用隐式参数与显示参数基于类的访问权限私有方法final实例字段静态字段与静态方法静态字段静态常量静态方法工厂方法main方法方法参数对…

windows路由表 重启后就还原了_绕过Apple id并可以随意重启的终极方案来了 (Windows下操作)...

▲请务必点击上方的蓝字关注我们哦&#xff01;「做有用的文章」我们知道自从Cheak M8漏洞出现后&#xff0c;使得A11-A7设备可以绕过AppleID使用&#xff0c;但是有着许多限制&#xff0c;例如不能重启&#xff0c;不能打电话使用蜂窝数据。如今针对无法修复蜂窝数据的Apple I…

UVA - 725 Division-sprintf的妙用

题目&#xff1a; 输入整数n&#xff0c;按从小到大顺序输出所有形如abcde/fghijn的表达式&#xff0c;其中a~j 恰好为0~9的一个排列&#xff08;可以有前导0&#xff09;&#xff0c;2<n<79 解题思路&#xff1a; 暴力枚举。 下面这代码暴力dfs&#xff0c;结果超时了…

基于.NET下的人工智能系列专题|.NET下的人工智能系列专题|用Keras.NET 做一个图像识别的训练...

.NET Core 的应用场景越来越广&#xff0c;开源社区也不断壮大&#xff0c; .NET Core在机器学习领域不断发展ML.NET外&#xff0c;也通过结合Tensorflow.NET去完善ML.NET在深度学习领域的功能&#xff0c;在ML.NET 1.3开始迈出了非常重要的一步。这不仅是微软拥抱开源的策略&a…

CoreJava 笔记总结-第五章 继承

文章目录第五章 继承类、超类和子类定义子类覆盖方法子类构造器多态阻止继承: final类和方法强制类型转换抽象类受保护访问访问控制修饰符小结Object: 所有类的超类Object类型的变量equals方法相等测试与继承hashCode方法toString方法泛型数组列表声明数组列表访问数组列表元素…