前言

前文中我们去获取value值的时候,都是通过configurationRoot 来获取的,如configurationRoot["key"],这种形式。

这种形式有一个不好的地方,那就是不方便。那么看下.net core如何将其转换为强类型。

正文

引入:Microsoft.extensions.configuration.Binder 这个包。

配置文件内容如下:

{
  "key1": "IamString",
  "key2": 10,
  "key3": true
}

代码:

class Program
{
	static void Main(string[] args)
	{
		IConfigurationBuilder builder = new ConfigurationBuilder();
		builder.AddJsonFile(System.AppDomain.CurrentDomain.BaseDirectory + "/appsettings.json",optional:false,reloadOnChange: true);
		var configurationRoot = builder.Build();

		Config config = new Config();
		configurationRoot.Bind(config);

		Console.WriteLine($"key1:{config.Key1}");
		Console.WriteLine($"key2:{config.Key2}");
		Console.WriteLine($"key3:{config.Key3}");

		Console.ReadKey();
	}
}

class Config
{
	public string Key1 { get; set; }

	public int Key2 { get; set; }

	public bool Key3 { get; set; }
}

重新整理 .net core 实践篇—————配置系统之强类型配置[十]-LMLPHP

这样就绑定了我们的强类型,这里非常有用,后面在注册服务使用配置的时候,原理便是如此。

假如配置一个service服务,现在配置文件变成这样:

{
  "key1": "IamString",
  "key2": 10,
  "key3": true,
  "Service": {
    "host": "127.0.0.1",
    "port": "8888"
  }
}

那么要获取service这个的配置怎么破?

static void Main(string[] args)
{
	IConfigurationBuilder builder = new ConfigurationBuilder();
	builder.AddJsonFile(System.AppDomain.CurrentDomain.BaseDirectory + "/appsettings.json",optional:false,reloadOnChange: true);
	var configurationRoot = builder.Build();

	Service service = new Service();
	configurationRoot.GetSection("Service").Bind(service);

	Console.WriteLine($"Service.Host {service.Host}");
	Console.WriteLine($"Service.Host {service.Port}");

	Console.ReadKey();
}

class Service
{
     public string Host { get; set; }

     public string Port { get; set; }
}

重新整理 .net core 实践篇—————配置系统之强类型配置[十]-LMLPHP

如果看过前面几篇的肯定知道为什么configurationRoot.GetSection("Service").Bind(service); 这样去绑定。

因为会把文件json转换为字典,字典的key是Service:Host 这种,而GetSection原理其实就是section+index字符拼接作为新的key。

这里展示转换为字典的结果:

重新整理 .net core 实践篇—————配置系统之强类型配置[十]-LMLPHP

上述这种方式可以注入进公共属性变量但是私有的不行。

static void Main(string[] args)
{
	IConfigurationBuilder builder = new ConfigurationBuilder();
	builder.AddJsonFile(System.AppDomain.CurrentDomain.BaseDirectory + "/appsettings.json",optional:false,reloadOnChange: true);
	var configurationRoot = builder.Build();

	Service service = new Service();
	configurationRoot.GetSection("Service").Bind(service);

	Console.WriteLine($"Service.Host {service.Host}");
	Console.WriteLine($"Service.Host {service.Port}");

	Console.ReadKey();
}


class Service
{
	public string Host { get; set; }

	public string Port { get; private set; } = "999";
}

结果: 端口显示 999
重新整理 .net core 实践篇—————配置系统之强类型配置[十]-LMLPHP

这时候需要设置BindNonPublicProperties 为true

class Program
{
	static void Main(string[] args)
	{
		IConfigurationBuilder builder = new ConfigurationBuilder();
		builder.AddJsonFile(System.AppDomain.CurrentDomain.BaseDirectory + "/appsettings.json",optional:false,reloadOnChange: true);
		var configurationRoot = builder.Build();

		Service service = new Service();
		configurationRoot.GetSection("Service").Bind(service, BinderOptions =>
		{
			BinderOptions.BindNonPublicProperties = true;
		});

		Console.WriteLine($"Service.Host {service.Host}");
		Console.WriteLine($"Service.Host {service.Port}");

		Console.ReadKey();
	}
}

class Service
{
	public string Host { get; set; }

	public string Port { get; private set; } = "999";
}

结果:
重新整理 .net core 实践篇—————配置系统之强类型配置[十]-LMLPHP

以上只是个人整理,如有错误望请指点,谢谢。

下一节 配置系统之简单版对接配置中心

06-03 13:59