.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


相关文章
|
6月前
|
开发框架 .NET C#
ASP.NET Core Blazor 路由配置和导航
大家好,我是码农刚子。本文系统介绍Blazor单页应用的路由机制,涵盖基础配置、路由参数、编程式导航及高级功能。通过@page指令定义路由,支持参数约束、可选参数与通配符捕获,结合NavigationManager实现页面跳转与参数传递,并演示用户管理、产品展示等典型场景,全面掌握Blazor路由从入门到实战的完整方案。
548 6
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:<https://github.com/khellang/Scrutor>
548 5
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
417 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
开发框架 算法 中间件
ASP.NET Core 中的速率限制中间件
在ASP.NET Core中,速率限制中间件用于控制客户端请求速率,防止服务器过载并提高安全性。通过`AddRateLimiter`注册服务,并配置不同策略如固定窗口、滑动窗口、令牌桶和并发限制。这些策略可在全局、控制器或动作级别应用,支持自定义响应处理。使用中间件`UseRateLimiter`启用限流功能,并可通过属性禁用特定控制器或动作的限流。这有助于有效保护API免受滥用和过载。 欢迎关注我的公众号:Net分享 (239字符)
376 1
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
445 3
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
292 0
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
612 5
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
690 0
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
356 7
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
345 0
下一篇
开通oss服务