配置IConfiguration


前言

配置是我们必不可少的功能,我们在开发中,经常会遇到需要获取配置信息的需求,那么如何才能优雅的获取配置信息?

我们希望新的配置:

  1. 支持强类型
  2. 配置变更后通知
  3. 学习难度低

快速入门

根据使用场景我们将配置分为本地配置以及远程配置,下面我们就来看一下本地配置与远程配置是如何来使用的?

  • 安装.Net 6.0

本地配置

  1. 新建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
  1. 新建类AppConfigConnectionStrings,用于存储数据库配置
/// 
/// 应用配置类
/// 
public class AppConfig : LocalMasaConfigurationOptions
{
    public ConnectionStrings ConnectionStrings { get; set; }
}

public class ConnectionStrings
{
    public string DefaultConnection { get; set; }
}
  1. 修改文件appsettings.json
{
  "AppConfig": {
    "ConnectionStrings": {
      "DefaultConnection": "server=localhost;uid=sa;pwd=P@ssw0rd;database=identity"
    }
  }
}
  1. 注册MasaConfiguration,修改类Program
builder.AddMasaConfiguration();
  1. 如果使用?修改类Program
app.MapGet("/AppConfig", (IOptions appConfig)
{
    return appConfig.Value.ConnectionStrings.DefaultConnection);
});

如果希望监听配置变更事件,则可使用IOptionsMonitor的OnChange方法

远程配置

目前我们远程配置的能力仅实现了CommandLineConfigurationSource

  • EnvironmentVariablesConfigurationSource
  • KeyPerFileConfigurationSource
  • MemoryConfigurationSource
  • 配置提供者
    • CommandLineConfigurationProvider
    • EnvironmentVariablesConfigurationProvider
    • KeyPerFileConfigurationProvider
    • MemoryConfigurationProvider
  • 全局配置

    MasaConfiguration中提供了全局配置的功能,并默认支持AppIdEnvironmentCluster

    1. 优先级

    获取参数值的优先级为:

    自定义全局配置 > 从IConfiguration中获取(支持命令、环境变量、配置文件) > 约定配置
    
    1. 自定义全局配置
    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");// 自定义全局配置键、值
    })
    
    1. IConfiguration中获取

    当未指定配置的值时,将会从配置中获取得到配置的值,默认配置与Key的关系为:

    • AppId: AppId
    • Environment: ASPNETCORE_ENVIRONMENT
    • Cluster: Cluster

    当命令行与环境变量获取参数失败后,则会尝试从配置文件根据配置的Key获取对应的值

    1. 约定默认值

    当未自定义配置,且无法从IConfiguration中获取到相对应参数的配置后,我们将根据约定好的规则生成对应的值

    • AppId: 启动程序名.Replace(".", "-")
    • Environment: Production
    • Cluster: Default

    配置映射

    在快速入门的例子中,看似很简单就可以通过IOptions获取到AppConfig的配置信息以及Dcc中配置的Redis信息,这一切是如何做到的呢?

    在MasaConfiguration中提供了两种映射方式,用来映射配置与类的对应关系,分别是:自动映射、手动映射。

    1. 自动映射

    分为本地配置以及远程配置的自动映射

    • 本地配置: 由Masa.Contrib.Configuration提供
    • 远程配置
      • Dcc: 由Masa.Contrib.Configuration.ConfigurationApi.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,欢迎联系我们

    16373211753064.png