配置IConfiguration
前言
配置是我们必不可少的功能,我们在开发中,经常会遇到需要获取配置信息的需求,那么如何才能优雅的获取配置信息?
我们希望新的配置:
- 支持强类型
- 配置变更后通知
- 学习难度低
快速入门
根据使用场景我们将配置分为本地配置以及远程配置,下面我们就来看一下本地配置与远程配置是如何来使用的?
- 安装.Net 6.0
本地配置
- 新建ASP.NET Core 空项目
Assignment.MasaConfiguration
,并安装Masa.Contrib.Configuration
dotnet new web -o Assignment.MasaConfiguration
cd Assignment.MasaConfiguration
dotnet add package Masa.Contrib.Configuration --version 0.6.0-preview.7
- 新建类
AppConfig
、ConnectionStrings
,用于存储数据库配置
///
/// 应用配置类
///
public class AppConfig : LocalMasaConfigurationOptions
{
public ConnectionStrings ConnectionStrings { get; set; }
}
public class ConnectionStrings
{
public string DefaultConnection { get; set; }
}
- 修改文件
appsettings.json
{
"AppConfig": {
"ConnectionStrings": {
"DefaultConnection": "server=localhost;uid=sa;pwd=P@ssw0rd;database=identity"
}
}
}
- 注册
MasaConfiguration
,修改类Program
builder.AddMasaConfiguration();
- 如果使用?修改类
Program
app.MapGet("/AppConfig", (IOptions appConfig)
{
return appConfig.Value.ConnectionStrings.DefaultConnection);
});
如果希望监听配置变更事件,则可使用IOptionsMonitor
的OnChange方法
远程配置
目前我们远程配置的能力仅实现了CommandLineConfigurationSource
- CommandLineConfigurationProvider
- EnvironmentVariablesConfigurationProvider
- KeyPerFileConfigurationProvider
- MemoryConfigurationProvider
全局配置
MasaConfiguration中提供了全局配置的功能,并默认支持AppId
、Environment
、Cluster
- 优先级
获取参数值的优先级为:
自定义全局配置 > 从IConfiguration中获取(支持命令、环境变量、配置文件) > 约定配置
- 自定义全局配置
service.Configure(options =>
{
options.AppId = "Replace-With-Your-AppId";
options.Environment = "Replace-With-Your-Environment";
options.Cluster = "Replace-With-Your-Cluster";
options.TryAdd("Replace-With-Your-ConfigKey", "Replace-With-Your-ConfigValue");// 自定义全局配置键、值
})
- IConfiguration中获取
当未指定配置的值时,将会从配置中获取得到配置的值,默认配置与Key的关系为:
AppId
:AppId
Environment
:ASPNETCORE_ENVIRONMENT
Cluster
:Cluster
当命令行与环境变量获取参数失败后,则会尝试从配置文件根据配置的Key获取对应的值
- 约定默认值
当未自定义配置,且无法从IConfiguration中获取到相对应参数的配置后,我们将根据约定好的规则生成对应的值
AppId
: 启动程序名.Replace(".", "-")Environment
:Production
Cluster
:Default
配置映射
在快速入门的例子中,看似很简单就可以通过IOptions
获取到AppConfig
的配置信息以及Dcc
中配置的Redis
信息,这一切是如何做到的呢?
在MasaConfiguration中提供了两种映射方式,用来映射配置与类的对应关系,分别是:自动映射、手动映射。
- 自动映射
分为本地配置以及远程配置的自动映射
- 本地配置: 由
Masa.Contrib.Configuration
提供 - 远程配置
- Dcc: 由
Masa.Contrib.Configuration.ConfigurationApi.Dcc
提供
- Dcc: 由
1.1 当配置存储在本地时,则将对应的配置类继承LocalMasaConfigurationOptions
//
/// 应用配置类
///
public class AppConfig : LocalMasaConfigurationOptions
{
// ///
// /// 如果当前配置挂载在根节点(一级节点)时,则无需重载,如果挂载在二级节点时,则需要重载ParentSection并赋值为一级节点名
// /// 根节点名:默认为一级节点,可不写,格式:一级节点:二级节点:三级节点……
// ///
// [JsonIgnore]
// public override string? ParentSection => null;
// ///
// /// 如果类名与节点名保持一致,则可忽略不写,否则重写`Section`并赋值为节点名
// ///
// [JsonIgnore]
// public override string? Section => "RabbitMq";
public ConnectionStrings ConnectionStrings { get; set; }
}
public class ConnectionStrings
{
public string DefaultConnection { get; set; }
}
当配置中的参数直接平铺挂载根节点下,而不是挂载到跟节点下的某个指定节点时,
ParentSection
无需重载,Section
需要重载并赋值为空字符串
1.2 当配置存储在Dcc: Distributed Configuration Center 是一个以DDD为指导思想、使用.Net6.0开发的分布式配置中心
本章源码
Assignment08
https://github.com/zhenlei520/MasaFramework.Practice
开源地址
MASA.Framework:https://github.com/masastack/MASA.Framework
MASA.EShop:https://github.com/masalabs/MASA.EShop
MASA.Blazor:https://github.com/BlazorComponent/MASA.Blazor
如果你对我们的 MASA Framework 感兴趣,无论是代码贡献、使用、提 Issue,欢迎联系我们