teleware.foundation.configuration - wengys/Teleware.Foundation GitHub Wiki

Teleware.Foundation.Configuration

配置管理

概述

配置管理基于Microsoft.Extensions.Configuration以及Microsoft.Extensions.Options,提供了针对Console、Asp.net、Asp.net core一致的配置体验。

配置管理主要分为以下两块:

  1. 启动配置

    读取系统启动时初始化配置(具体配置源、是否采用分布式配置、Autofac模块配置等),启动时默认读取,无法修改

  2. 运行配置

    读取所有运行时用到的配置

启动配置

启动配置涉及以下类/接口:

  1. IBootupConfigurationProvider

    定义一个启动配置源,获取启动配置对应的IConfigurationRoot

  2. BootupConfigurationProviderExtensions

    获取以下特定配置:

    • Autofac配置
    • NLog配置文件(NLog.config)路径
  3. BootupConfigurationProvider

    默认启动配置源实现,读取运行目录(参见此处)下 bootup.json(必要) 以及 bootup.{env.EnvironmentName}.json(可选) 配置文件。

    bootup.json中包括以下信息:

    • 默认运行配置路径
    • NLog.config路径
    • 运行配置源
    • Autofac配置
    • 其他启动时配置

启动配置需要在具体项目项目中手工初始化,并注册到Autofac中。比如下面这个控制台初始化的例子:

var env = new ApplicationEnvironment(); // 声明环境
var bootupConfigurationProvider = new BootupConfigurationProvider(env);
var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterInstance(env).As<IEnvironment>(); // 在autofac中注册当前环境
containerBuilder.RegisterInstance(bootupConfigurationProvider).As<IBootupConfigurationProvider>(); // 在autofac中注册IBootupConfigurationProvider实例
var configurationModule = new Autofac.Configuration.ConfigurationModule(bootupConfigurationProvider.GetAutofacConfiguration()); // 读取autofac配置
containerBuilder.RegisterModule(configurationModule);

var container = containerBuilder.Build();

// ...

运行配置

运行设置涉及以下nuget包/类/接口

  1. IConfigurationFactory

    定义一个运行时配置工厂

  2. ConfigurationFactory

    默认配置工厂实现,支持Json文件源以及Consul键值对源

  3. OptionsAutofacExtensions

    提供用于向Autofac注册配置实体的ConfigureOptions系列扩展方法

    由于需要与Asp.net core环境解耦,故而此处直接向Autofac注册配置实体

  4. Microsoft.Extensions.Options.IOptionsSnapshot(来自 Microsoft.Extensions.Options 包)

    用于获取配置实体用

Json文件源

Json配置文件均存放于启动配置中指定的Configuration:ConfigurationRootPath路径下,遵守以下约定:

  • 文件名为*.json, 全小写
  • 正文为一匿名对象,正文匿名对象只有一个字段,此字段与文件名一致(大小写遵循C#规则)

如数据库配置database.json:

{
  "Database": {
    "ConnectionStrings": {
      "Default": {
        "ProviderName": "Oracle.ManagedDataAccess.Client",
        "ConnectionString": "User ID=scott;Password=tiger;Data Source=localhost:1521/xe"
      }
    }
  }
}

控制台项目中,需要将配置文件复制到输出目录,最简单的方法是在VS中, 配置文件的属性"复制到输出目录"设置为"如果较新则复制"

Consul键值对源

Consul为分布式键值对/服务发现服务,参见Consul官网

要使用Consul配置服务,需要

  1. 设置Configuration:Consul:Enable为true
  2. 设置Configuration:Consul:Name为合适的名称
  3. 在Consul中,增加Key为$"{_configOptions.Consul.Name}.{_env.EnvironmentName}",值参考Json配置的项

如以数据库配置为例,项目名为Test,当前环境为Production,则Consul中需要增加以下键值对

Consul键值对截图

读取运行时配置

为方便管理运行时配置,请遵循以下约定:

  • 类放置于*.Options命名空间下
  • 类名为*Options,如Teleware.Foundation.Options.DatabaseOptions

要通过IOptionsSnapshot读取配置,需要

  1. 在Autofac配置中,注册配置实体。如:

    public class Module : Autofac.Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            builder.ConfigureOptions<DatabaseOptions>(); // 注册DatabaseOptions
        }
    }
    
  2. 在使用配置处,注入IOptionsSnapshot<SomeOptions>。如:

    public class SomeService //确保此类也由Autofac创建实例
    {
        public SomeService(IOptionsSnapshot<DatabaseOptions> dbOptions) // 通过构造函数注入DatabaseOptions
        {
            // ...
        }
    }