一、介紹

    微軟已經對外提供了新的平臺,我們叫它們是 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 下編碼還是有很大的差別的,配置檔案的訪問也是不同的,應用的類庫也是不同的,作為自己的日誌吧。也許時間長了,自己忘卻了,可以來這裡看看。不忘初心,繼續努力。