ASP.NET Core-配置

介绍:

可使用多种类型数据源(内存、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    //返回值是字符串类型

强类型读取:
1string[] 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": ""
      }
    ]

  }
}
View Code
    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; }
    }
View Code

未完待续...

原文地址:https://www.cnblogs.com/fanfan-90/p/12144825.html