.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 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:<https://github.com/khellang/Scrutor>
25 5
|
2月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
24天前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
35 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
14天前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
24 3
|
3月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
3月前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
111 3
|
2月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
3月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
46 7
|
3月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
74 0
|
4月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
55 0