Asp.Net Core 3.1學習-讀取、監聽json配置檔案(7)

魏楊楊發表於2020-05-14

1、前言

檔案配置提供程式預設的給我們提供了ini、json、Xml等。都是讀取不同格式的檔案。檔案配置提供程式支援檔案可尋、必選、檔案變更的監視。

2、讀取配置檔案

主要運用的包:需要Ini、xml的新增相關包就行。

這次依然使用 Core3.1 WebApi專案,在啟動程式介面裡面讀取json配置檔案,先看看json檔案的格式。裡面有很多巢狀的子元素。

{
    "Name": "wyy",
    "Age": 18,
    "QQ": "30119459",
    "CardInfo": {
        "Name": "wyy",
        "Card": "5303231999XXX",
        "Birthday": "2001-02-28",
        "Address": {
            "Provience": "雲南省",
            "City": "XX市",
            "Country": "XX縣"
        }
    },
    "IsMarry": true
}

我們在WeatherForecastController中修改get方法來讀取配置檔案

[HttpGet]
        public int Get()
        {
            var builder = new ConfigurationBuilder();
            //引數 檔案路徑       optional:檔案不錯在就會報錯(預設false)    reloadOnChange:檔案變更了讀取新的檔案(預設true)
            builder.AddJsonFile("config.json",optional:false,reloadOnChange:true);
            var configRoot = builder.Build().GetSection("CardInfo").GetSection("Address");
            var city = $"City:{configRoot["City"]}";
            Console.WriteLine(city);
            return 1;
        }

這裡需要注意的是,如果有很多層就挨個的GetSection 下去,現在讀取到的就是Address裡面的資訊。這裡讀取就跟MVC裡面的一樣的  直接configRoot["節點名"];

3、使用實體類來接收配置檔案

新增一個實體類configDto,裡面的資訊要跟配置檔案對應,資料型別也要對應,這裡的原理就跟JsonConvert序列化一樣 不對應的就接收不到值

 public class ConfigDto
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string QQ { get; set; }
        public CardInfo CardInfo { get; set; }
        public bool IsMarry { get; set; }

    }
    public class CardInfo
    {
        public string Name { get; set; }
        public string Card { get; set; }
        public string Birthday { get; set; }
        public Address Address { get; set; }

    }
    public class Address
    {
        public string Provience { get; set; }
        public string City { get; set; }
        public string Country { get; set; }
    }

呼叫的程式碼

[HttpGet]
        public int Get()
        {
            var builder = new ConfigurationBuilder();
            //引數 檔案路徑       optional:檔案不錯在就會報錯(預設true)    reloadOnChange:檔案變更了讀取新的檔案(預設true)
            builder.AddJsonFile("config.json",optional:true,reloadOnChange:true);
            ConfigDto conf = new ConfigDto();
            var configRoot = builder.Build();
                configRoot.Bind(conf);
            return 1;
        }

執行專案打上斷點  新增監視可以Dto也獲取到值了,這樣強型別的呼叫起來豈不是更方便。

 4、監視檔案的變更

[HttpGet]
        public int Get()
        {
            var builder = new ConfigurationBuilder();
            //引數 檔案路徑       optional:檔案不錯在就會報錯(預設false)    reloadOnChange:檔案變更了讀取新的檔案(預設true)
            builder.AddJsonFile("config.json",optional:false,reloadOnChange:true);
        
            ConfigDto conf = new ConfigDto();
            var configRoot = builder.Build();
                configRoot.Bind(conf);
            //監視檔案變更
            IChangeToken token = configRoot.GetReloadToken();
            ChangeToken.OnChange(() => configRoot.GetReloadToken(), () =>
            {
                //做你想做的事  業務邏輯
                Console.WriteLine("檔案修改了");
            });
            return 1;
        }

修改檔案可以看到儲存的時候就會出現,不知道為何會出現兩次下來研究研究;

 5、總結

這裡主要弄了檔案的讀取、監視、強型別接收等操作、關於配置檔案的程式修改下來慢慢研究。關於實體型別是否能設定私有有待考證。學無止境。

每日一句心靈雞湯:其實一個人也是可以活得漂亮,自己笑給自己看,自己哭給自己聽。懂得讓步的人是聰明的,這是把決定事態走向的主動權握在了自己手上。感情對抗中,贏了面子就輸了情分。往往死撐到底的人,都成孤家寡人。彎腰不是認輸,只是為了拾起丟掉的幸福。

 

相關文章