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课:自定义配置数据源:低成本实现定制化配置方案)--学习笔记...相关推荐

  1. 《物联网开发实战》09 边缘中心:物联网网关有多重要?(学习笔记)

    仅作为本人学习<物联网开发实战>的学习笔记,原课程链接:极客时间<物联网开发实战>--郭朝斌 不是所有的设备都使用 Wi-Fi 这类可以直接接入互联网从而与云平台通信的通信技术 ...

  2. .NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(上)

    05 | 依赖注入:良好架构的起点 为什么要使用依赖注入框架 借助依赖注入框架,我们可以轻松管理类之间的依赖,帮助我们在构建应用时遵循设计原则,确保代码的可维护性和可扩展性 ASP.NET Core ...

  3. .NET Core开发实战(定义API的最佳实践)Source Generators版

    前言 极客时间上的<.NET Core开发实战>是一门非常好的课程,作者肖伟宇在第31课(https://time.geekbang.org/course/detail/100044601 ...

  4. 三维数字沙盘电子沙盘人工智能地理信息系统开发教程第14课

    三维数字沙盘电子沙盘人工智能地理信息系统开发教程第14课 很久没有写了,主要前段时间在针对怎么显示高精度的 倾斜数据而努力,现在终于实现了效果不错.以前的版本显示倾斜数据控制不太好.最近SDK也改动了 ...

  5. 高度可定制化的方案_如何开发高度可定制的产品

    高度可定制化的方案 您是否听说过:"我们非常喜欢您的产品--除了一些小细节."? 然后,CIO推出了一系列其他"必备"要求的清单,其中有数百个要添加到您的惊人产 ...

  6. .NET Core开发实战(第19课:日志作用域:解决不同请求之间的日志干扰)--学习笔记...

    19 | 日志作用域:解决不同请求之间的日志干扰 开始之前先看一下上一节的代码 // 配置的框架 var configBuilder = new ConfigurationBuilder(); con ...

  7. .NET Core开发实战(第9课:命令行配置提供程序)--学习笔记

    09 | 命令行配置提供程序:最简单快捷的配置注入方法 这一节讲解如何使用命令行参数来作为配置数据源 命令行配置(提供程序的)支持三种格式的命令 1.无前缀的 key=value 模式 2.双中横线模 ...

  8. .NET Core开发实战(第8课:配置框架:让服务无缝适应各种环境)--学习笔记

    08 | 配置框架:让服务无缝适应各种环境 配置是应用程序发布到各种环境的必备能力,这一节开始详细讲解 ASP.NET Core 的配置框架 配置框架的核心包有两个,一个抽象包,一个实现包 Micro ...

  9. .NET Core开发实战(第4课:Startup:掌握ASP.NET Core的启动过程)--学习笔记

    04 | Startup:掌握ASP.NET Core的启动过程 新建一个 ASP.NET Core Web 应用程序 选择 API public class Program {public stat ...

最新文章

  1. SAP模块常用增强总结
  2. Python面向对象篇(2)-继承
  3. java开源的cms系统jsp cms系统
  4. 中国大学单身 (民间)排行榜!你上榜了没
  5. html5 轮询自动刷新数据,后台调用exe,前端定时轮询调用结果
  6. java web请求字符串处理_java web工作常用技能篇(三)-封装复杂请求对象2
  7. 建模实训报告总结_建筑实训报告总结
  8. 创建学生管理系统java实训1
  9. 苹果一体机电脑计算机图标找不到,mac电脑airplay图标不见了怎么办
  10. Photoshop又来神器!人脸动态捕捉来了!
  11. 设置linux开机自动运行某条命令或程序和安装jdk(jar)
  12. 领导力培训知识点汇总及感悟-1
  13. angular路由守卫
  14. 银河系列超级计算机处理器,超14000颗CPU 探秘世界最快超级计算机
  15. 在国内用Windows给BT做种,真是一山绕过一山缠(附解决方案)
  16. 勒索病毒威胁的解决方案
  17. 概率 插空法和捆绑法
  18. 项目为何要开展第三方测试
  19. NS2协议分析与仿真
  20. SpringMVC---(2)

热门文章

  1. 【Java基础】Java中的持久属性集Properties
  2. Android开发最佳实践《IT蓝豹》
  3. PowerDesigner新建模板
  4. poj 1860 Currency Exchange (最短路bellman_ford思想找正权环 最长路)
  5. 如何在ashx页面获取Session值(未将对象引用设置到对象的实例) (转)
  6. WPF企业内训全程实录(下)
  7. Commons里的DButil
  8. C++回声服务器_4-UDP connect版本客户端
  9. 066:ORM查询条件详解-startswith和endswith:
  10. 免费都不管用,Win10升级在中国怎么就这么难?