如何在 NetCore 中定義我們自己的JSON配置文件的管理器。
- 2021 年 8 月 4 日
- 筆記
- C#語言特性, configuration, netcore, 配置文件
一、介紹
微軟已經對外提供了新的平台,我們叫它們是 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 下編碼還是有很大的差別的,配置文件的訪問也是不同的,應用的類庫也是不同的,作為自己的日誌吧。也許時間長了,自己忘卻了,可以來這裡看看。不忘初心,繼續努力。