.NET Core配置强类型绑定及配置热更新能力

简介: 学习了配置框架的4种配置方式之后,我们可以对不同的环境选择不同的配置方式,以使服务能够更好的适应各种环境,那么,你是否觉得配置虽然加载进服务中,但是使用起来却不是很方便,每次读取都得通过对应的键值去根查找,是否想过如果我们修改了配置文件呢?本篇,我们一起来学习下这两个问题。为了方便演示,本节使用文件提供程序配置方式。

准备

为了方便演示,我们先给出配置文件、文件提供程序的配置方式及配置对应的类的定义。


//settings.json
{
  "key1": "value1",
  "key2": 0,
  "Section1": {
    "key3": "value3",
    "key4": 10,
    "key5": true
  }
}
//文件提供程序
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddJsonFile("settings.json");
IConfigurationRoot configurationRoot = configurationBuilder.Build();
//ConfigModel
class ConfigModel
{
    public String key1 { get; set; }
    public int key2 { get; set; }
    public int key4 { get; set; }
    public bool key5 { get; private set; } = false;
}


配置强类型绑定


配置加载完成后,我们可以根据需要定义响应的类,通过bind方法将配置绑定到类上,从而可以便捷的读取配置。类中属性的定义与配置中的键值相对应,而且,我们可以为不同的节定义不同的类,从而对配置进行更加清晰的管理。


Bind()方法

通过Bind方法,我们可以将配置绑定到配置类,为了区分,我们在如下的定义中对配置类做了初始值设置。

ConfigModel configModel = new ConfigModel() { key1 = "value1new", key2 = 10 ,key4=30};
configurationRoot.Bind(configModel);


此时运行,那么ConfigModel的key1、key2是有值的,但key4、key5无值,因此,我们还需要对包含key4、key5的节进行绑定。


configurationRoot.GetSection("Section1").Bind(configModel);

这样,我们就可以获取到key3和key4的值了,但是,key5依然无法访问,你知道为什么吗?因为key5是private的,我们没办法对其直接进行设置。


私有属性绑定

要将配置绑定到私有属性,要使用Bind方法的第二个参数BinderOptions,该参数有一个BindNonPublicProperties的属性,用于指示是否允许绑定到私有属性。


configurationRoot.GetSection("Section1").Bind(configModel,options=> { options.BindNonPublicProperties = true; });

这里,我们用options.BindNonPublicProperties = true来允许绑定到私有属性。这样,我们就可以获取key5的值了。


通过将不同的配置,甚至是同一配置下的不同节绑定到对应的配置类,我们可以很清晰的明确各配置间的关系并便捷的进行读取。


配置热更新


IChangeToken接口

通过配置强类型绑定,我们确实可以便捷的读取配置,但是,如果我们的配置发生了变化呢?是否会主动的重新加载?

配置框架中提供了IChangeToken接口,让我们可以来监听配置的变更,用法如下


IChangeToken changeToken = configurationRoot.GetReloadToken();

IChangeToken方法有一个RegisterChangeCallback的方法,通过该方法可以定义配置变更后的回调函数,如


changeToken.RegisterChangeCallback(state =>
{
    Console.WriteLine($"key1:{configurationRoot["key1"]}");
    Console.WriteLine($"key2:{configurationRoot["key2"]}");
}, configurationRoot);


这样,我们在配置文件发生变化后,就会通过IChangeToken监听到该更改,并通过其回调方法来重新输出key1和key2的值。


但是,IChangeToken接口只能获取一次变更监听,也就是说,第二次更改就不会生效了,如果要继续,我们只能通过在其中继续定义该接口来实现。因此,微软为我们提供了另外的一个接口用来处理这种情形。


配置变更的持续监听

微软提供了一个ChangeToken的类,其中定义了OnChange的静态方法,该扩展方法有2个参数,一个是监听IChangeToken对象的委托,一个是其回调方法。


ChangeToken.OnChange(() => configurationRoot.GetReloadToken(), () =>
{
    Console.WriteLine($"key1:{configurationRoot["key1"]}");
    Console.WriteLine($"key2:{configurationRoot["key2"]}");
});


通过该扩展方法即可实现配置变更的持续监听。


这里,我们的演示代码是以文件提供程序为例的,而且该种方式只适用于文件提供程序,内存配置、命令行配置、环境变量配置可以通过自定义的监听逻辑来实现,具体过程与上述类似,这里就不详说了,你可以自己试着写一下。


详细代码请参阅


https://github.com/IronMarmot/Samples/tree/master/CoreSamples


相关文章
|
21天前
|
开发框架 NoSQL .NET
利用分布式锁在ASP.NET Core中实现防抖
【9月更文挑战第5天】在 ASP.NET Core 中,可通过分布式锁实现防抖功能,仅处理连续相同请求中的首个请求,其余请求返回 204 No Content,直至锁释放。具体步骤包括:安装分布式锁库如 `StackExchange.Redis`;创建分布式锁服务接口及其实现;构建防抖中间件;并在 `Startup.cs` 中注册相关服务和中间件。这一机制有效避免了短时间内重复操作的问题。
|
1月前
|
开发框架 JSON 安全
分享一个 .NET Core 使用选项方式读取配置内容的详细例子
分享一个 .NET Core 使用选项方式读取配置内容的详细例子
|
1月前
|
开发框架 监控 .NET
开发者的革新利器:ASP.NET Core实战指南,构建未来Web应用的高效之道
【8月更文挑战第28天】本文探讨了如何利用ASP.NET Core构建高效、可扩展的Web应用。ASP.NET Core是一个开源、跨平台的框架,具有依赖注入、配置管理等特性。文章详细介绍了项目结构规划、依赖注入配置、中间件使用及性能优化方法,并讨论了安全性、可扩展性以及容器化的重要性。通过这些技术要点,开发者能够快速构建出符合现代Web应用需求的应用程序。
33 0
|
1月前
|
缓存 数据库连接 API
Entity Framework Core——.NET 领域的 ORM 利器,深度剖析其最佳实践之路
【8月更文挑战第28天】在软件开发领域,高效的数据访问与管理至关重要。Entity Framework Core(EF Core)作为一款强大的对象关系映射(ORM)工具,在 .NET 开发中扮演着重要角色。本文通过在线书店应用案例,展示了 EF Core 的核心特性和优势。我们定义了 `Book` 实体类及其属性,并通过 `BookStoreContext` 数据库上下文配置了数据库连接。EF Core 提供了简洁的 API,支持数据的查询、插入、更新和删除操作。
55 0
|
1月前
【Azure 应用服务】App Service 配置 Application Settings 访问Storage Account得到 could not be resolved: '*.file.core.windows.net'的报错。没有解析成对应中国区 Storage Account地址 *.file.core.chinacloudapi.cn
【Azure 应用服务】App Service 配置 Application Settings 访问Storage Account得到 could not be resolved: '*.file.core.windows.net'的报错。没有解析成对应中国区 Storage Account地址 *.file.core.chinacloudapi.cn
|
1月前
|
开发框架 监控 .NET
【Azure 应用程序见解】在Docker中运行的ASP.NET Core应用如何开启Application Insights的Profiler Trace呢?
【Azure 应用程序见解】在Docker中运行的ASP.NET Core应用如何开启Application Insights的Profiler Trace呢?
|
1月前
|
Linux C# C++
【Azure App Service For Container】创建ASP.NET Core Blazor项目并打包为Linux镜像发布到Azure应用服务
【Azure App Service For Container】创建ASP.NET Core Blazor项目并打包为Linux镜像发布到Azure应用服务
|
1月前
|
开发框架 .NET API
如何在 ASP.NET Core Web Api 项目中应用 NLog 写日志?
如何在 ASP.NET Core Web Api 项目中应用 NLog 写日志?
|
21天前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
25 7
|
19天前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
36 0