14 | 自定义配置数据源:低成本实现定制化配置方案
扩展步骤
- 实现IConfigurationSource
- 实现IConfigurationProvider
- 实现AddXXX扩展方法
示例
新建控制台应用程序👉命名ConfigurationCustom
👉引入包Microsoft.Extensions.Configuration
👉新建三个类:MyConfigurationSource.cs
、MyConfigurationProvider.cs
、MyConfigurationBuilderExtensions.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"]);
}
}
}
输出:
但是我们这样子去分发我们的配置源的包的话,我们会需要把我们的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"]);
}
}
}
输出:
之前我们学到了要使用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();
}
}
}
输出:
推荐这些技术文章:
一、为什么需要 window ?在流处理应用中,数据是连续不断的,即数据是没有边界的,因此我们不可能等到所有数据都到了才开始处理。当然我们可以每来一个消息就处理一次,但是有时我们需要做一些聚合类的处理,例如:在过去的1分钟内有多少用户点击了我们的网页。在这种情况下,我们必须定义一个窗口,用来收集最近一分钟内的数据,并对这个窗口内的数据进行计算。流上的聚合需要由 window 来划定范围,比如 “...
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...
对于单元测试、集成测试大部分开发的朋友都懒得去写,因为这要耗费精力去设计去开发,做完项目模块直接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...
1.1 项目准备
mybatis框架分析
1.1.1 项目环境
sqlMapConfig.xml核心配置文件,去掉DTD约束。因为dom4j会上网去找dtd文件。
UserMapper.xml映射配置文件,去掉DTD约束。
UserMapper接口。
User实体类。
导入相关jar包
UserMapper.xml
5.1.2 代码实现
创建包cn.guardw...
磁盘不够大,备份文件每天都生成,大概半个月就得手工清理一次,基于此,花了点时间写了个简单文件清理工具
采用WinForm 4.6.1实现,页面上需要拖放一个TextBox 控件
1、配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedR...
Consul 简介
Consul是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控)解决方案,它是一个一个分布式的,高度可用的系统,而且开发使用都很简便。它提供了一个功能齐全的控制平面,主要特点是:服务发现、健康检查、键值存储、安全服务通信、多数据中心。除了 Consul 之外,还有 Eureka、Zookeeper 等类似软件。
https://www.jia...
文章链接:https://www.dianjilingqu.com/50967.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。