如何在 NetCore 中定義我們自己的JSON配置文件的管理器。

一、介紹

    微軟已經對外提供了新的平台,我們叫它們是 Net Core 平台,這個平台和 Net Framework 平台有本質的區別,這個最本質的區別就是微軟的C#程式碼可以跨平台了。當前我們主流的3大平台 Net Core 都支援的挺好的,比如:Windows、Linux和Mac。當然編程的體驗和方式也發生了很大的不同了。我們以前使用的 Net Framework 平台就是一個大而全的平台,類似全家桶,使用很方便,但是也很笨重。但是 Net Core 平台就採用了「按需索取」的最小設計原則,搭建框架和設計系統,如果我們需要其他類庫可以通過 Nuget 獲取。

    今天,我們也不會聊太多的東西,拋磚引玉,說說如何在 NetCore 裡面如何自定義基於 json 配置文件的管理器的,編程體驗還是有不小差異的。

二、編碼實現

    今天我們在類庫裡面定義一個可以訪問基於 JSON 的配置文件的配置文件管理器對象。當然這個類庫是也是可以跨平台的,當前版本是 Net 5.0。

    1、在開始我們的編碼之前,我們先要進入必要的類庫。

      Microsoft.Extensions.Configuration.Abstractions

      Microsoft.Extensions.Configuration.FileExtensions

      Microsoft.Extensions.Configuration.Json

    2、編寫我們自定義的配置文件管理器。

      我們這個類型可以配置默認配置文件,myconfiguration.json,也可以自己增加的配置文件,覆蓋默認的配置文件。

      程式碼很簡單,沒有什麼可以多說了。

      

  1 using Microsoft.Extensions.Configuration;
  2 using System.IO;
  3 
  4 namespace PatrickLiu.NetCore50.IOCFramework
  5 {
  6     /// <summary>
  7     /// 該類型定義了自己定義配置文件的配置管理器。
  8     /// </summary>
  9     public sealed class CustomConfigurationManager
 10     {
 11         #region 私有欄位
 12 
 13         private IConfigurationRoot _configurationRoot;
 14         private string _configuration;
 15 
 16         #endregion
 17 
 18         #region 靜態欄位
 19 
 20         private static CustomConfigurationManager _instance;
 21         private static readonly object lockObj = new object();
 22 
 23         #endregion
 24 
 25         #region 構造函數
 26 
 27         /// <summary>
 28         /// 類型構造函數,用於初始化配置跟對象和配置對象的生成器。
 29         /// </summary>
 30         private CustomConfigurationManager()
 31         {
 32             JsonConfigurationFile = "myconfiguration.json";
 33             Init();
 34         }
 35 
 36         #endregion
 37 
 38         #region 公用私有方法
 39 
 40         /// <summary>
 41         /// 初始化配置文件資訊。
 42         /// </summary>
 43         private void Init()
 44         {
 45             var builder = new ConfigurationBuilder()
 46                     .SetBasePath(Directory.GetCurrentDirectory())
 47                     .AddJsonFile(JsonConfigurationFile);
 48 
 49             _configurationRoot = builder.Build();
 50         }
 51 
 52         #endregion
 53 
 54         #region 對外的訪問介面
 55 
 56         /// <summary>
 57         /// 獲取 CustomConfigurationManager 類型的單件實例。
 58         /// </summary>
 59         public static CustomConfigurationManager Current
 60         {
 61             get
 62             {
 63                 if (_instance == null)
 64                 {
 65                     lock (lockObj)
 66                     {
 67                         if (_instance == null)
 68                         {
 69                             _instance = new CustomConfigurationManager();
 70                         }
 71                     }
 72                 }
 73                 return _instance;
 74             }
 75         }
 76 
 77         /// <summary>
 78         /// 獲取或者設置 json 的配置文件。
 79         /// </summary>
 80         public string JsonConfigurationFile
 81         {
 82             get { return _configuration; }
 83             set
 84             {
 85                 if (!string.IsNullOrEmpty(value) && !string.IsNullOrWhiteSpace(value))
 86                 {
 87                     _configuration = value;
 88                     Init();
 89                 }
 90             }
 91         }
 92 
 93         /// <summary>
 94         /// 獲取指定名稱節點的配置數據。
 95         /// </summary>
 96         /// <param name="nodeName">配置節點的名稱。</param>
 97         /// <returns></returns>
 98         public string GetNode(string nodeName)
 99         {
100             if (string.IsNullOrEmpty(nodeName) || string.IsNullOrWhiteSpace(nodeName))
101             {
102                 return null;
103             }
104             return _configurationRoot[nodeName];
105         }
106 
107         #endregion
108     }
109 }

    3、測試方法,我建立了兩個文件,配置文件的名稱分別是:myconfiguration.json,myconfiguration2.json

      配置文件的內容很簡單,分別如下:
      myconfiguration.json      

{
  "IServiceA": "PatrickLiu.NetCore50.IOCServiceses.MyServiceB,PatrickLiu.NetCore50.IOCServiceses"
}

      myconfiguration2.json

1 {
2   "IServiceA2": "PatrickLiu.NetCore50.IOCServiceses.MyServiceB,PatrickLiu.NetCore50.IOCServiceses00000000"
3 }

      

1             {
2                 var config=CustomConfigurationManager.Current.GetNode("IServiceA");
3                 CustomConfigurationManager.Current.JsonConfigurationFile = "myconfiguration2.json";
4                 config = CustomConfigurationManager.Current.GetNode("IServiceA2");
5 
6             }    

 

三、總結。

    這個也沒有什麼難度,只是簡單說明一下,NetCore 下編碼還是有很大的差別的,配置文件的訪問也是不同的,應用的類庫也是不同的,作為自己的日誌吧。也許時間長了,自己忘卻了,可以來這裡看看。不忘初心,繼續努力。