14 | 自定义配置数据源:低成本实现定制化配置方案

扩展步骤

  • 实现IConfigurationSource
  • 实现IConfigurationProvider
  • 实现AddXXX扩展方法

示例

新建控制台应用程序👉命名ConfigurationCustom👉引入包Microsoft.Extensions.Configuration👉新建三个类:MyConfigurationSource.csMyConfigurationProvider.csMyConfigurationBuilderExtensions.cs

首先,MyConfigurationSource.cs继承接口IConfigurationSource

using Microsoft.Extensions.Configuration;
using System;

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

MyConfigurationProvider.cs没有直接继承IConfigurationProvider而是继承了抽象类ConfigurationProvider,这个类实际上是继承了IConfigurationProvider

using Microsoft.Extensions.Configuration;
using System;
using System.Timers;

namespace ConfigurationCustom
{
    class MyConfigurationProvider : ConfigurationProvider
    {
        private readonly 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);
        }
		// 入参表示我们这里是否是重新加载,如果重新加载,我们需要触发OnReload这个方法
        private void Load(bool reload)
        {
            Data["lastTime"] = DateTime.Now.ToString();
            if (reload)
            {
                OnReload();
            }
        }
    }
}

我们继承了ConfigurationProvider之后,键入一些代码,设置一个Timer每3秒将当前时间给Provider,来模拟配置发生变化。
修改Program

using Microsoft.Extensions.Configuration;
using System;

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

输出:image.png
但是我们这样子去分发我们的配置源的包的话,我们会需要把我们的MyConfigurationSource定义为public的,否则使用方式没办法引用到我们这个类的,那么我们就可以通过扩展方法的方法来保障我们不需要暴露我们的configSource
之前我们创建了类MyConfigurationBuilderExtensions

using ConfigurationCustom;

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

首先我们把这个扩展方法的命名空间,放在了config的命名空间,这样方便我们在引用的时候直接使用。然后把其它两个类定义为internal。如果分发到第三方的话,internal的类是不能被引用的。
之后去使用的话,将Program类的builder.Add(new MyConfigurationSource()修改为builder.AddMyConfiguration()

using Microsoft.Extensions.Configuration;
using System;

namespace ConfigurationCustom
{
    class Program
    {
        static void Main(string[] args)
        {
            var builder = new ConfigurationBuilder();
            builder.AddMyConfiguration();
            var root = builder.Build();
            Console.WriteLine(root["lastTime"]);
        }
    }
}

输出:image.png

之前我们学到了要使用ChangeToken的方式来监听配置变化,现在这里一样使用ChangeToken.OnChange

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Primitives;
using System;

namespace ConfigurationCustom
{
    class Program
    {
        static void Main(string[] args)
        {
            var builder = new ConfigurationBuilder();
            builder.AddMyConfiguration();
            var root = builder.Build();
            ChangeToken.OnChange(() => root.GetReloadToken(), () =>
            {
                Console.WriteLine(root["lastTime"]);
            });
            Console.WriteLine("开始监听配置:");
            Console.ReadKey();
        }
    }
}

输出:image.png

推荐这些技术文章:

Flink的窗口处理机制(一)

一、为什么需要 window ?在流处理应用中,数据是连续不断的,即数据是没有边界的,因此我们不可能等到所有数据都到了才开始处理。当然我们可以每来一个消息就处理一次,但是有时我们需要做一些聚合类的处理,例如:在过去的1分钟内有多少用户点击了我们的网页。在这种情况下,我们必须定义一个窗口,用来收集最近一分钟内的数据,并对这个窗口内的数据进行计算。流上的聚合需要由 window 来划定范围,比如 “...

identityServer4初探netcore 3.x

identityServer

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hos...

一次asp.net core3.1打造webapi开发框架的实践

实践技术看点

1、Swagger管理API说明文档
2、JwtBearer token验证
3、Swagger UI增加Authentication
4、EntityFrameworkCore+MySQL
5、在.net core 3.1下使用Log4net

前言
元旦过后就没什么工作上的任务了,这当然不能让领导看在眼里,动手实践一下新技术吧。于是准备搭一个webapi的中间件框架。
由...

identityServer4初探netcore 3.x----------2

mvc

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInj...

netcore3.0 webapi集成Swagger 5.0

今天来尝尝鲜。貌似.net core 3.0使用Swagger 4.0.1会报错,随手一搜,还没人写这个把调试通过的代码贴一下:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Ex...

Net6 Xunit 集成测试

        对于单元测试、集成测试大部分开发的朋友都懒得去写,因为这要耗费精力去设计去开发,做完项目模块直接postman 调用测试(当然这是一个选择,开发也中经常用到),但是如果测试需要多样化数据,各种场景模拟这样postman测试就暴露了他的局限性,下面我将Net6下没有使用Startup以及NET6以前版本使用Startup的集成测试(单元测试雷...

PlatformNotSupportedException:System.DirectoryServices.AccountManagement

using Microsoft.Extensions.Configuration;
using Novell.Directory.Ldap;
using ProGra.Services.ADService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using L...

Mybatis-Mapper封装数据类

1.1 项目准备

mybatis框架分析

1.1.1 项目环境

sqlMapConfig.xml核心配置文件,去掉DTD约束。因为dom4j会上网去找dtd文件。
UserMapper.xml映射配置文件,去掉DTD约束。
UserMapper接口。
User实体类。

导入相关jar包

UserMapper.xml


5.1.2 代码实现

创建包cn.guardw...

windows 文件清理工具

磁盘不够大,备份文件每天都生成,大概半个月就得手工清理一次,基于此,花了点时间写了个简单文件清理工具
采用WinForm 4.6.1实现,页面上需要拖放一个TextBox 控件
1、配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedR...

Consul服务治理发现学习记录

Consul 简介
Consul是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控)解决方案,它是一个一个分布式的,高度可用的系统,而且开发使用都很简便。它提供了一个功能齐全的控制平面,主要特点是:服务发现、健康检查、键值存储、安全服务通信、多数据中心。除了 Consul 之外,还有 Eureka、Zookeeper 等类似软件。

https://www.jia...

文章标题:14 | 自定义配置数据源:低成本实现定制化配置方案
文章链接:https://www.dianjilingqu.com/50967.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
下一篇>>