介绍:
可使用多种类型数据源(内存、xml、json、ini、command、env...)
多环境版本,可通过环境变量获取不同的配置文件
热加载,修改配置文件后可不重启项目,重新将文件加载到内存;
Configuraion相关的Package都是以Microsoft.Extensions.Configuration开头的,支持多种配置方式;
如果多次添加相同的配置,后添加的会覆盖之前添加的;
使用ConfiguraionBuilder添加数据源,最后调用Build()方法生成IConfiguration,通过IConfiguraion读取配置,这是建造者模式;
添加JSON配置文件:
var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); var config = builder.Build(); //读取配置 Console.WriteLine(config["Alipay:AppId"]); Console.WriteLine(config["Alipay:PriviteKey"]);
使用ConfiguraionBuilder添加数据源,调用Build()方法,返回IConfiguraion。
框架创建了ConfigurationBuilder,并注入到容器,且添加了appsettings.json,不需要我们手动添加这个文件,所以应使用已存在的ConfiguraionBuilder添加数据源,使用下面的方式添加数据源
使用已存在的ConfigurationBuilder添加配置源:
添加JSON、XML文件作为配置元之前需要设置基础路径 SetBasePath(Environment.CurrentDirectory)
在已存在的ConfigurationBuilder中添加数据源, WebHost.CreateDefaultBuilder(args).ConfigureAppConfiguration((hostingContext, config) =>{//...在此处添加数据源...});
添加JSON配置源
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
return WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(configurationBuilder => configurationBuilder.AddJsonFile("hosts.json", false, true))
.UseStartup<Startup>();
}
添加内存配置源
Dictionary<string, string> source = new Dictionary<string, string>
{["longDatePattern"] = "dddd, MMMM d, yyyy",
["longTimePattern"] = "h:mm:ss tt"};
IConfiguration config = new ConfigurationBuilder()
.Add(new MemoryConfigurationSource { InitialData = source })
.Build();
添加环境变量数据源
IConfiguration config = new ConfigurationBuilder().AddEnvironmentVariables("T_")
添加XML数据源
IConfiguration config = new ConfigurationBuilder().AddXmlFile("appsetting.xml")
添加命令行数据源
configurationBuilder.AddCommandLine(args)
读取配置:
弱类型读取:
1、Configuration["Logging:Default:t1"] //按层级取值,返回值是字符串类型
2、Configuration.GetSection("Ips").Value //返回值是字符串类型
强类型读取:
1、string[] ips = Configuration.GetSection("Ips").Get<string[]>();
2、LogLevel logLevel = Configuration.GetSection("Logging:LogLevel").Get<LogLevel>();
3、Logging logging = new Logging();
Configuration.GetSection("Logging").Bind(logging);//强类型绑定
4、CACHE_TIME = configuration.GetValue<int>("CACHE_TIME", 20);//20是默认值,需要安装 Microsoft.Extensions.Configuration.Binder包
5、services.Configure<Logging>(Configuration.GetSection("Logging"));//将对象注册到容器,在构造函数中获取POCO对象,称为Options模式
Options:
使用Configure()添加配置,IOptions的默认实现是OptionsManager
通过配置文件添加配置:
// 使用配置文件来注册实例
services.Configure<MyOptions>(Configuration.GetSection("Sign"));
// 指定具体名称
services.Configure<MyOptions>("my", Configuration.GetSection("Sign"));
// 配置所有实例
services.ConfigureAll<MyOptions>(Configuration.GetSection("Sign"));
使用Lambda添加配置:
// 最简单的注册方式
services.Configure<MyOptions>(o => o.DefaultValue = true);
// 指定具体名称
services.Configure<MyOptions>("my", o => o.DefaultValue = true);
// 配置所有实例
services.ConfigureAll<MyOptions>(o => o.DefaultValue = true);
DI:可以使用IOptions或IOptionsSnapshot,区别是IOptionsSnapshot支持热更新
public HomeController(IOptions<LogLevelClass> logLevelOption) { }
案例1:
{ "Logging": { "LogLevel": { "Default": "Warning" } }, "AllowedHosts": "*", "LogLevel": { "Default": "Warning" }, "DBConfig": { "Default": "db1", "Configs": [ { "Name": "db1", "DBType": "sqlserver", "ConnectionString": "Server=192.168.0.44,1433;initial catalog=FMS;uid=sa;pwd=123;Pooling=true;Max Pool Size=40000;Min Pool Size=0;MultipleActiveResultSets=true;", "RepositoryName": "" } ] } }
public class DBConfig: IDBConfig { public DBConfig(IConfiguration configuration) { this.LoadConfigs(configuration); } private void LoadConfigs(IConfiguration configuration) { var dbConfig = configuration.GetSection("DBConfig"); this.Default = dbConfig["Default"]; var configs = dbConfig.GetSection("Configs"); var configCount = configs.GetChildren().Count(); for (int i = 0; i < configCount; i++) { var config = configs.GetSection(i.ToString()); this.DBConfigs.Add(new DBConfigInfo() { Name = config.GetValue<string>("Name"), DBType = config.GetValue<string>("DBType"), ConnectionString = config.GetValue<string>("ConnectionString"), IsDefault=this.Default== config.GetValue<string>("Name") }); } } public List<DBConfigInfo> DBConfigs { get; private set; } public string Default { get; private set; } }
未完待续...