zoukankan      html  css  js  c++  java
  • 重新整理 .net core 实践篇—————配置系统之强类型配置[十]

    前言

    前文中我们去获取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";
    }
    

    结果:

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

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

  • 相关阅读:
    宝塔面板的数据库使用
    Spring MVC入门
    从分式第n项到线性递推——bostan-mori 算法的扩展应用
    计算几何专题训练
    博客整理
    wpf ScrollViewer自动滚到最上
    word2Vec笔记2021
    好用工具备份
    Samtools pick up seq
    Ryzen核显需要扩大显存吗?
  • 原文地址:https://www.cnblogs.com/aoximin/p/14843225.html
Copyright © 2011-2022 走看看