.Net Core之編輯json配置文件


 

引言

最近在具體項目開發應用中,項目采用的json格式配置文件,配置文件的加載采用的IConfiguration接口對象進行的管理,這是.net standard時代,微軟所提供的現代化的配置管理工具。

項目設計中,需要在運行過程中,將遠程服務端發送過來的配置信息回寫到配置文件中。然而,必應也好,百度也罷,翻遍網絡,這套現代化的配置管理模型中,卻找不到一個可以改變配置回寫的方法。

無奈之下,只好自己動手,手動造輪子了。

.NET Standard時代的配置模型

隨着.NET Standard時代的來臨,System.Configuration在.net core中已經不存在了,那么取而代之的是Microsoft.Extensions.Configuration系列配置管理類庫:

Microsoft.Extensions.Configuration.Abstractions:基礎接口

Microsoft.Extensions.Configuration:實現上面的基礎接口

Microsoft.Extensions.Configuration.FileProviderExtensions:提供重載配置擴展

Microsoft.Extensions.Configuration.Binder:提供轉換到實體功能

Microsoft.Extensions.Configuration.FileExtensions:提供配置文件根路徑擴展

 

相關文章資源

關於以上類庫的使用,網上有大量相關文章,如知名博主大內老A的文章中,有着系統、詳細闡述,各位可自行查閱。

鏈接在此:https://www.cnblogs.com/artech/p/config-for-net-core.html

 

配置類的建議用法

出於編程上的便利,我們通常不會直接利用ConfigurationBuilder創建的Configuration對象讀取某個單一配置項的值,而是傾向於將一組相關的配置綁定為一個對象。

例如筆者某個項目消息主題配置參數類如下:

1 public class TopicConfig
2 {
3         public string Project { get; set; } ="ibms";
4         public string Device { get; set; } = "gateway";
5         public string City { get; set; } = "wuhan";
6         public string Area { get; set; } = "poly";   
7 }
View Code

我們可以為配置類指定默認參數。

在需要使用配置參數的對象中,我們可以將配置類設置為屬性字段

 

private TopicConfig topicConfig = new TopicConfig();

 

當對象類被實例化時,配置類將自動被構造並擁有默認配置參數

我們在需要使用配置的對象類中,寫一個加載配置類的方法和保存配置類的方法,當對象類構造時,調用並執行加載配置文件。

當配置文件存在時,判斷對應的配置段是否存在,如果存在,則綁定到對應的配置類,從而實現配置參數的加載(對象類中,相關需要使用配置參數的地方,直接從配置類的獲取參數);

當配置文件不存在時,加載配置方法調用保存配置方法,將默認配置回寫到配置文件中。

當配置參數動態更新后需要保存時,也通過調用保存配置方法,將配置參數更新到配置文件中。

 

示例json配置文件

{
    "topic": {
        "Project": "ibms",
        "Device": "gateway",
        "City": "wuhan",
        "Area": "poly"
    }
}

 

加載配置方法

   筆者采用程序目錄下的"appsettings.json"文件作為配置文件

 1        private void LoadConfig()
 2         {
 3             var path = Directory.GetCurrentDirectory();
 4             var config_file = "appsettings.json";
 5             var full_path = Path.Combine(path, config_file);
 6             if (File.Exists(full_path))
 7             {
 8                 var builder = new ConfigurationBuilder()
 9                     .SetBasePath(path)
10                     .AddJsonFile("appsettings.json");
11 
12                 IConfiguration Configuration = builder.Build();
13 
14                 if (Configuration.GetSection(Topic).Exists())//Topic為字符串常量,對應配置段屬性名稱
15                     Configuration.GetSection(Topic).Bind(topicConfig);//綁定配置數據到配置類
16             }
17             else
18             {
19                 SaveConfig();
20             }
21      }
View Code

 

在dotnet core由於采用了更為模塊化的設計方式,使用配置類需要引用相應的程序包,我們在程序中使用json配置,需要安裝Microsoft.Extensions.Configuration.Json程序包。

Bind方法為擴展方法,需要項目中先安裝Microsoft.Extensions.Configuration.Binder程序包。

程序包可通過Nuget包管理器進行安裝。

 

保存配置方法  

1 private void SaveConfig(string path = "")
2 {
3         if (path == "") path = Directory.GetCurrentDirectory();
4         Dictionary<string, object> sectionsInfo = new Dictionary<string, object>();
5 
6         sectionsInfo.Add(Topic, topicConfig); //Topic為字符串常量,對應配置段屬性名稱
7         JsonConfigHelper.SaveJson(sectionsInfo, path);
8 }
9             
View Code

調用json配置保存類,將配置保存到指定的位置。

 

通用Json配置保存類

筆者針對需要改寫配置文件的應用的需要,自行實現了一個保存json格式配置文件的通用類,支持同時保存多個配置類。

支持對現有配置文件節點的改寫和追加配置節點。

 

 1 using System;
 2 using System.Collections.Generic;
 3 using System.IO;
 4 using Newtonsoft.Json;
 5 using Newtonsoft.Json.Linq;
 6 
 7 namespace flyfire.Common
 8 {
 9     public class JsonConfigHelper
10     {
11         public static bool SaveJson(Dictionary<string,object> sectionInfo, string configFilePath, string configFileName = "appsettings.json")
12         {
13             if (sectionInfo.Count==0)
14                 return false;
15 
16             try
17             {
18                 var filePath = Path.Combine(configFilePath, configFileName);
19                 JObject jsonObject;
20 
21                 if (File.Exists(filePath))
22                 {
23                     using (StreamReader file = new StreamReader(filePath))
24                     {
25                         using (JsonTextReader reader = new JsonTextReader(file))
26                         {
27                             jsonObject = (JObject)JToken.ReadFrom(reader);
28                         }
29                     }
30                 }
31                 else
32                 {
33                     jsonObject = new JObject();
34                 }
35 
36                 foreach (var key in sectionInfo.Keys)
37                 {
38                     jsonObject[key] = JObject.FromObject(sectionInfo[key]);
39                 }
40 
41                 using (var writer = new StreamWriter(filePath))
42                 using (JsonTextWriter jsonwriter = new JsonTextWriter(writer)
43                 {
44                     Formatting = Formatting.Indented,//格式化縮進
45                     Indentation = 4,  //縮進四個字符
46                     IndentChar = ' '  //縮進的字符是空格
47                 })
48                 {
49                     jsonObject.WriteTo(jsonwriter);
50                     return true;
51                 }
52             }
53             catch (Exception)
54             {
55                 return false;
56             }
57         }
58     }
59 }
View Code

 

至此,我們完成了Json格式配置文件的加載、綁定與保存。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM