重新整理 .net core 實踐篇—————配置系統之強型別配置[十]

不問前世發表於2021-06-03

前言

前文中我們去獲取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; }
}

這樣就繫結了我們的強型別,這裡非常有用,後面在註冊服務使用配置的時候,原理便是如此。

假如配置一個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; }
}

如果看過前面幾篇的肯定知道為什麼configurationRoot.GetSection("Service").Bind(service); 這樣去繫結。

因為會把檔案json轉換為字典,字典的key是Service:Host 這種,而GetSection原理其實就是section+index字元拼接作為新的key。

這裡展示轉換為字典的結果:

上述這種方式可以注入進公共屬性變數但是私有的不行。

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

這時候需要設定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";
}

結果:

以上只是個人整理,如有錯誤望請指點,謝謝。

下一節 配置系統之簡單版對接配置中心

相關文章