• 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

    未完待续...

  • 相关阅读:
    设计模式与23种设计模式的简单介绍
    一文读懂C++ Vector在算法竞赛中的常见用法
    一文读懂C++ String类在算法竞赛中的常见用法
    GO语言的单元测试与性能测试
    变量提升和函数提升及二者优先级
    闭包
    读《你不知道的JavaScript 中》-异步【3】Promise
    js数组方法-改变原数组和不改变原数组
    读《你不知道的JavaScript 中》-异步【2】回调
    组合类算法问题
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/12144825.html
Copyright © 2020-2023  润新知