写在前面

经过前面三篇关于.NET Core Configuration的文章之后,本篇文章主要讨论如何扩展一个Configuration组件出来。如果前面三篇文章没有看到,可以点击如下地址访问

  • Consul-key-value-dashboard

    配置值采用JSON格式

    Consul-key-value-commonservice-json

    实现思路

    我们知道在Configuration整个的设计框架里,比较重要的类ConfigurationRoot,内部又有一个IConfigurationProvider集合属性,也就是说我们追加IConfigurationProvider实例最终也会被放到到该集合中,如下图所示

    rootproviders

    该项目中,我使用到了一个已经封装好的Consul(V0.7.2.6)类库,同时基于.NET Core关于Configuration的设计风格,做如下的框架设计

    consul

    考虑到我会在该组件内部创建ConsulClient实例,所以对ConsulClient构造函数的一部分参数做了抽象提取,并添加到了IConsulConfigurationSource中,以增强该组件的灵活性。

    之前说过,Consul中的配置信息是以JSON格式存储的,所以此处使用到了Microsoft.Extensions.Configuration.Json.JsonConfigurationFileParser,用以将JSON格式的信息转换为Configuration的通用格式Key/Value。

    核心代码

    IConsulConfigurationSource

       1:  /// <summary>
       2:  /// ConsulConfigurationSource
       3:  /// </summary>
       4:  public interface IConsulConfigurationSource : IConfigurationSource
       5:  {
       6:      /// <summary>
       7:      /// CancellationToken
       8:      /// </summary>
       9:      CancellationToken CancellationToken { get; }
      10:   
      11:      /// <summary>
      12:      /// Consul构造函数实例,可自定义传入
      13:      /// </summary>
      14:      Action<ConsulClientConfiguration> ConsulClientConfiguration { get; set; }
      15:   
      16:      /// <summary>
      17:      ///  Consul构造函数实例,可自定义传入
      18:      /// </summary>
      19:      Action<HttpClient> ConsulHttpClient { get; set; }
      20:   
      21:      /// <summary>
      22:      ///  Consul构造函数实例,可自定义传入
      23:      /// </summary>
      24:      Action<HttpClientHandler> ConsulHttpClientHandler { get; set; }
      25:   
      26:      /// <summary>
      27: