teleware.foundation.configuration - wengys/Teleware.Foundation GitHub Wiki
Teleware.Foundation.Configuration
配置管理
概述
配置管理基于Microsoft.Extensions.Configuration以及Microsoft.Extensions.Options,提供了针对Console、Asp.net、Asp.net core一致的配置体验。
配置管理主要分为以下两块:
-
启动配置
读取系统启动时初始化配置(具体配置源、是否采用分布式配置、Autofac模块配置等),启动时默认读取,无法修改
-
运行配置
读取所有运行时用到的配置
启动配置
启动配置涉及以下类/接口:
-
IBootupConfigurationProvider
定义一个启动配置源,获取启动配置对应的
IConfigurationRoot
-
BootupConfigurationProviderExtensions
获取以下特定配置:
- Autofac配置
- NLog配置文件(NLog.config)路径
-
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包/类/接口
-
IConfigurationFactory
定义一个运行时配置工厂
-
ConfigurationFactory
默认配置工厂实现,支持Json文件源以及Consul键值对源
-
OptionsAutofacExtensions
提供用于向Autofac注册配置实体的ConfigureOptions系列扩展方法
由于需要与Asp.net core环境解耦,故而此处直接向Autofac注册配置实体
-
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配置服务,需要
- 设置
Configuration:Consul:Enable
为true - 设置
Configuration:Consul:Name
为合适的名称 - 在Consul中,增加Key为
$"{_configOptions.Consul.Name}.{_env.EnvironmentName}"
,值参考Json配置的项
如以数据库配置为例,项目名为Test,当前环境为Production,则Consul中需要增加以下键值对
读取运行时配置
为方便管理运行时配置,请遵循以下约定:
- 类放置于
*.Options
命名空间下 - 类名为
*Options
,如Teleware.Foundation.Options.DatabaseOptions
要通过IOptionsSnapshot读取配置,需要
-
在Autofac配置中,注册配置实体。如:
public class Module : Autofac.Module { protected override void Load(ContainerBuilder builder) { builder.ConfigureOptions<DatabaseOptions>(); // 注册DatabaseOptions } }
-
在使用配置处,注入IOptionsSnapshot<SomeOptions>。如:
public class SomeService //确保此类也由Autofac创建实例 { public SomeService(IOptionsSnapshot<DatabaseOptions> dbOptions) // 通过构造函数注入DatabaseOptions { // ... } }