MiCoos 哟,写bug呢?

.NETCore-配置文件

2019-02-18
GHMicoos

概述:.Net Core中应用配置是基于“配置提供程序”建立的键对值。“配置提供程序”从各种配置源读取键值对作为配置数据。各种配置源包括Azure Key Value,命令行参数,自定义提供程序,Key-per-file配置,环境变量,内存中的.Net对象,配置文件(XML,Json,INI)。本文这里暂时只讨论配置文件

一 配置文件(INI,XML,Json)

1.创建配置文件

  • 以Josn为例子,其他文件一样的。

{
  "Name": "Jerry",
  "option1": "value1_from_json",
  "option2": 2,

  "subsection": {
    "suboption1": "subvalue1_from_json"
  },
  "wizards": [
    {
      "Name": "Gandalf",
      "Age": "1000"
    },
    {
      "Name": "Harry",
      "Age": "17"
    }
  ],
  "RedisConfig": [
    {
      "Connection": "127.0.0.1:6379,connectTimeout=3600",
      "InstanceName": "Redis_Default",
      "DefaultDatabase": 1,
      "ExpiryTimeSpan": 30
    }
  ]
}

2.使用配置文件

  • 需要在ConfigurationBuilder的实例上调用AddJsonFile(或AddIniFile,AddXmlFile)扩展方法。
  • 下面分为三个列子来展现在WebHostBuilder、和普通控制台程序使用配置文件。
  • 需要引入包Microsoft.extensions.configurationMicrosoft.Extensions.Configuration.Json(其他文件类型:Microsoft.Extensions.Configuration.Xml,Microsoft.Extensions.Configuration.Ini)
//配置主机时调用ConfigureAppConfiguration 来使用配置文件
public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.SetBasePath(Directory.GetCurrentDirectory());
                config.AddJsonFile("config.json", optional: true, reloadOnChange: true);
            })
            .UseStartup<Startup>();
}
////后续可以通过依赖注入 使用IConfiguration
//直接创建WebHostBuilder时候,也可以通过UseConfiguration方法,使用创建好的ConfigurationBuilder对象
var config = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("config.json", optional: true, reloadOnChange: true)
    .Build();

var host = new WebHostBuilder()
    .UseConfiguration(config)
    .UseKestrel()
    .UseStartup<Startup>();
//后续可以通过依赖注入 使用IConfiguration
//在普通控制台中直接创建ConfigurationBuilder,可以使用config对象
var config = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", false, true)
        .Build();

//var redisconfig = config.GetSection("RedisConfig").Get<List<RedisConfig>>();

二 读取配置文件的常用方法

1.GetSection

  • IConfiguration的接口方法GetSection,使用“指定的子节键”提取配置子节。
  • 存在于Microsoft.Extensions.Configuration.Abstractions包中,通过nuget引用包Microsoft.Extensions.Configuration会引入最为其依赖。
  • 签名:IConfigurationSection GetSection(string key);这个方法永远不会返回null。如果没有找到与指定键匹配的子节,则为空的Microsoft.Extensions.Configuration.IConfigurationSection将被返回。
  • Sample:

static void Main(string[] args)
{
    Console.WriteLine("Hello World!");

    var config = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", false, true)
            .Build();
    //Jerry
    var getValue01 = config.GetValue<string>("Name");
    //option2
    var getvalue02 = config.GetValue<int>("option2");

    //无法绑定复杂对象 null
    var getvalue03 = config.GetValue<List<RedisConfig>>("RedisConfig");
    var getvalue04 = config.GetValue<RedisConfig>("RedisConfig:0");
    var getvalue05 = config.GetSection("RedisConfig").GetValue<RedisConfig>("0");
    //127.0.0.1:6379,connectTimeout=3600
    var getvalue06 = config.GetValue<string>("RedisConfig:0:Connection");
    
    Console.ReadKey();
}

2.GetChildren

  • IConfiguration的接口方法GetChildren,获取直接子代配置子节(IEnumerable<IConfigurationSection>)。
  • 存在于Microsoft.Extensions.Configuration.Abstractions包中,通过nuget引用包Microsoft.Extensions.Configuration会引入最为其依赖。
  • 签名:IEnumerable<IConfigurationSection> GetChildren();
  • Sample:

static void Main(string[] args)
{
    Console.WriteLine("Hello World!");

    var config = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", false, true)
            .Build();
    //六个儿子节点
    var children01 = config.GetChildren()?.ToList();
    //一个儿子节点
    var children02 = config.GetSection("RedisConfig").GetChildren()?.ToList();
    //没有字节点,返回empty
    var children03 = config.GetSection("Name").GetChildren()?.ToList();
    //GetSection是empty ,返回empty
    var children04 = config.GetSection("Name01").GetChildren()?.ToList();
    

    Console.ReadKey();
}

3.Exists

  • IConfigurationSection的扩展方法Exists,作用确定节点是否存在。
  • 存在于Microsoft.Extensions.Configuration.Abstractions包中,通过nuget引用包Microsoft.Extensions.Configuration会引入最为其依赖。
  • 签名:public static bool Exists(this IConfigurationSection section);
  • Sample:

static void Main(string[] args)
{
    Console.WriteLine("Hello World!");

    var config = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", false, true)
            .Build();

    //true
    var exist = config.GetSection("RedisConfig").Exists();
    //true
    var exist02 = config.GetSection("RedisConfig:0").Exists();
    //false
    var exist03 = config.GetSection("RedisConfig:1").Exists();
}

4.GetValue

  • IConfiguration的扩展方法GetValue,根据“指定键”从配置中提取一个值,并将其转换为指定类型。
  • 存在包Microsoft.Extensions.Configuration.Binder中。
  • 签名:
//有泛型方法,也有非泛型方法。

public static T GetValue<T>(this IConfiguration configuration, string key);

public static T GetValue<T>(this IConfiguration configuration, string key, T defaultValue);

public static object GetValue(this IConfiguration configuration, Type type, string key);

public static object GetValue(this IConfiguration configuration, Type type, string key, object defaultValue);

  • Sample:

static void Main(string[] args)
{
    Console.WriteLine("Hello World!");

    var config = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", false, true)
            .Build();

    //2
    var getvalue01 = config.GetValue<int>("option2");
    //如果不存在对应的键,那么直接返回默认值
    var getvalue02 = config.GetValue<int>("option00002");
    //"127.0.0.1:6379,connectTimeout=3600"
    var getvalue03 = config.GetSection("RedisConfig:0").GetValue<string>("Connection");

    //键对应的值还包括其他键值,无法转换
    var getvalue04 = config.GetValue<RedisConfig>("RedisConfig:0");
    
    Console.ReadKey();
}


5.Get、Bind

  • IConfiguration的扩展方法GetBind,尝试将配置项中的值,绑定到对应的对象。
  • 存在包Microsoft.Extensions.Configuration.Binder中。
  • 签名:

public static void Bind(this IConfiguration configuration, string key, object instance);

public static void Bind(this IConfiguration configuration, object instance);

public static void Bind(this IConfiguration configuration, object instance, Action<BinderOptions> configureOptions);

//Get有泛型与非泛型版本

public static T Get<T>(this IConfiguration configuration);

public static T Get<T>(this IConfiguration configuration, Action<BinderOptions> configureOptions);

public static object Get(this IConfiguration configuration, Type type);

public static object Get(this IConfiguration configuration, Type type, Action<BinderOptions> configureOptions);

// 

    public class BinderOptions
{
    public BinderOptions();

    //如果为false(默认值),绑定器将只尝试设置公共属性。如果为真,绑定器将尝试设置所有非只读属性。
    public bool BindNonPublicProperties { get; set; }
}

  • Sample:

static void Main(string[] args)
{
    Console.WriteLine("Hello World!");

    var config = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", false, true)
            .Build();

    //2
    var get01 = config.GetSection("option2").Get<int>();
    //可以绑定list
    var get02 = config.GetSection("RedisConfig").Get<List<RedisConfig>>();
    
    //绑定为List<RedisConfig>
    var bind01 = new List<RedisConfig>();
    config.GetSection("RedisConfig").Bind(bind01);
    //绑定为RedisConfig对象
    var bind02 = new RedisConfig();
    config.GetSection("RedisConfig:0").Bind(bind02);
    //无法绑定单一值,与GetValue无法绑定复杂对象一样。这个方法可以绑定复杂对象
    //但是无法绑定单一值
    var bind03 = -1;
    config.GetSection("RedisConfig:0:DefaultDatabase").Bind(bind03);
    
    
    Console.ReadKey();
}


Similar Posts

上一篇 Lambda-Set

Comments