日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

.Net Core下如何管理配置文件

發(fā)布時(shí)間:2025/6/15 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .Net Core下如何管理配置文件 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、前言

根據(jù)該issues來(lái)看,System.Configuration在.net core中已經(jīng)不存在了,那么取而代之的是由Microsoft.Extensions.Cnfiguration.XXX一系列的類(lèi)庫(kù)提供,對(duì)應(yīng)的開(kāi)源地址為點(diǎn)擊這里。

?

從當(dāng)前開(kāi)源的代碼來(lái)看,在.net core下提供了以下類(lèi)庫(kù)給我們:

Microsoft.Extensions.Configuration.Abstractions:基礎(chǔ)接口

Microsoft.Extensions.Configuration:實(shí)現(xiàn)上面的基礎(chǔ)接口

Microsoft.Extensions.Configuration.FileProviderExtensions:提供重載配置擴(kuò)展

Microsoft.Extensions.Configuration.Binder:提供轉(zhuǎn)換到實(shí)體功能

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

?

以下為提供對(duì)哪些方式的支持:

Microsoft.Extensions.Configuration.CommandLine:命令行參數(shù)

Microsoft.Extensions.Configuration.EnvironmentVariables:環(huán)境變量

Microsoft.Extensions.Configuration.Ini:Ini格式

Microsoft.Extensions.Configuration.Json:Json格式

Microsoft.Extensions.Configuration.Xml:Xml格式

?

由上面類(lèi)庫(kù)的數(shù)量我們可以看出今后我們不會(huì)在需要加載更多的庫(kù),只要按需加載就可以了,那么我們也可以看到新的Configuration提供了更多格式的支持,當(dāng)然我們自己也可以自行擴(kuò)展以提供對(duì)更多格式的支持。下面我們開(kāi)始進(jìn)入正文,從頭到尾的學(xué)習(xí)這5種支持的配置格式。

?

注意:需要VS2015開(kāi)發(fā)工具

?

二、正文

首先我們需要?jiǎng)?chuàng)建一個(gè)名為“CoreClrConfiguration”的空解決方案,下面將會(huì)在這一個(gè)解決方案中將下面幾節(jié)的內(nèi)容進(jìn)行演示。如果讀者只對(duì)其中某一個(gè)部分感興趣可以直接翻閱到對(duì)應(yīng)的內(nèi)容下,每個(gè)小節(jié)都是相互獨(dú)立的沒(méi)有對(duì)應(yīng)關(guān)系。

?

應(yīng)該新建哪種項(xiàng)目模板如下圖所示:

?

A. CommandLine(命令行參數(shù))

?

在新建項(xiàng)目(名為“CommandLineCfg”)中的project.json中增加以下的依賴(具體版本請(qǐng)讀者根據(jù)實(shí)際情況決定):

"Microsoft.Extensions.Configuration.CommandLine": "1.0.0-rc1-final",

"Microsoft.Extensions.Configuration.Binder": "1.0.0-rc1-final"

需要注意的是該依賴庫(kù)為全局依賴庫(kù),非dnx451或dnxcore50下的依賴庫(kù)。

?

注:在project.json指定完依賴庫(kù)之后需要右擊“引用”->“還原程序包”,之后的部分將不再闡述。

?

?

首先我們先舉一個(gè)簡(jiǎn)單的例子,讀取一個(gè)參數(shù)的值。首先打開(kāi)Program.cs文件在其中寫(xiě)入以下的程序:

1 public static void Main(string[] args) 2 { 3 var cmdLineConfig = new CommandLineConfigurationProvider(args); 4 cmdLineConfig.Load(); 5 6 string value1 = null; 7 cmdLineConfig.TryGet("key1", out value1); 8 9 Console.WriteLine($"key1={value1}"); 10 11 Console.ReadKey(); 12 }

?

這里我們可以看到“CommandLineConfigurationProvider”的命名,后面我們介紹的能夠提供對(duì)其他格式的支持都會(huì)以“xxxConfigurationProvider”來(lái)命名的,并且基類(lèi)都是“ConfigurationProvider”。簡(jiǎn)單的介紹完之后下面我們需要開(kāi)始運(yùn)行該程序,我們先打開(kāi)該項(xiàng)目的屬性,輸入一些測(cè)試用的命令行參數(shù):

?

當(dāng)然我們這里只是使用了其中一種支持的格式,其他支持的格式如下:

-Key1=Value1

--Key1=Value1

/Key1=Value1

--Key1 Value1

?

如果讀者,在應(yīng)用程序參數(shù)中的后面重復(fù)寫(xiě)了“/Key1 Value2”那么程序中只會(huì)采用最后一個(gè)設(shè)置的值且不區(qū)分大小寫(xiě)。

?

注:如果命令行參數(shù)只傳遞了key而沒(méi)有傳遞value那么在load的時(shí)候就會(huì)拋出FormatException異常。

?

類(lèi)似于我們常用的ORM一樣,對(duì)于外部命令行傳入的參數(shù),key我們其實(shí)是可以自己做投影,將對(duì)應(yīng)的key改為我們所希望的key。比如上面的“key1”我們就可以在改為“key2”。而要做到這一效果只需要在創(chuàng)建CommandLineConfigurationProvider的時(shí)候利用第二個(gè)參數(shù)將我們即可,比如下面我們將會(huì)將“key1”改為”key2”:

public static void Main(string[] args) {Dictionary<string, string> defaults = new Dictionary<string, string>{{ "--Key1","key2" }};var cmdLineConfig = new CommandLineConfigurationProvider(args, defaults);cmdLineConfig.Load();string value1 = null;cmdLineConfig.TryGet("key2", out value1);Console.WriteLine($"key1&key2={value1}");Console.ReadKey(); }

?

其中我們可以看到defaults字典中的key必須加上“--”或“-”否則在調(diào)用構(gòu)造函數(shù)時(shí)將會(huì)拋出ArgumentException異常。最終我們可以看到獲取值的時(shí)候是利用后來(lái)我們投影之后的key的名稱去獲取而不是“key1”了。

?

除了通過(guò)上面這種方式獲取值之外,還提供了一個(gè)通用的模型綁定,能夠?qū)⑵渌母袷睫D(zhuǎn)換為POCO,這樣能夠便于我們更快速的開(kāi)發(fā),下面筆者將通過(guò)兩種方式來(lái)講述,首先是利用我們當(dāng)前已經(jīng)創(chuàng)建好的Provider來(lái)進(jìn)行Bind,其中POCO如下:

public class CommandLineArgs {public string Key1 { get; set; } }

?

?

Main方法的實(shí)現(xiàn)如下:

var cmdLineConfig = new CommandLineConfigurationProvider(args); var builder = new ConfigurationBuilder(); builder.Add(cmdLineConfig); var item = builder.Build().Get<CommandLineArgs>();Console.WriteLine($"key1&key2={item.Key1}");

其中ConfigurationBuilder可以管理多個(gè)Provider,比如我們開(kāi)發(fā)一個(gè)系統(tǒng)可以將命令行、Json文件、Ini文件和XML文件都添加到其中進(jìn)行管理。如果我們調(diào)用了Builder方法,那么我們就可以利用其返回值統(tǒng)一的獲取我們想要的值,內(nèi)部會(huì)從這些Provider中嘗試獲取我們需要的值如果有值則立即返回,而模型綁定是通過(guò)對(duì)其擴(kuò)展加進(jìn)去的。具體擴(kuò)展了以下的方法:

public static class ConfigurationBinder {public static void Bind(this IConfiguration configuration, object instance);public static object Get(this IConfiguration configuration, Type type);public static object Get(this IConfiguration configuration, Type type, string key);public static T Get<T>(this IConfiguration configuration);public static T Get<T>(this IConfiguration configuration, T defaultValue);public static T Get<T>(this IConfiguration configuration, string key);public static T Get<T>(this IConfiguration configuration, string key, T defaultValue); }

?

其實(shí)現(xiàn)在Microsoft.Extensions.Configuration.Binder中。

?

另一種方式則是不通過(guò)創(chuàng)建CommandLineConfigurationProvider直接利用ConfigurationBuilder實(shí)現(xiàn)相同的效果:

var builder = new ConfigurationBuilder(); builder.AddCommandLine(args); var item = builder.Build().Get<CommandLineArgs>(); Console.WriteLine($"key1={item.Key1}");

其中AddCommandLine也是擴(kuò)展方法,并且下面的四種中都有對(duì)應(yīng)的擴(kuò)展,內(nèi)部的實(shí)現(xiàn)其實(shí)就是創(chuàng)建了Provider,比如這個(gè)方法的內(nèi)部實(shí)現(xiàn)如下:

1 public static IConfigurationBuilder AddCommandLine(this IConfigurationBuilder configurationBuilder, string[] args) 2 { 3 configurationBuilder.Add(new CommandLineConfigurationProvider(args)); 4 return configurationBuilder; 5 }

?

到這里關(guān)于命令行參數(shù)告一段落,如果讀者想了解更多的信息,可以查看對(duì)應(yīng)的源碼以及單元測(cè)試。

?

B. EnvironmentVariables(環(huán)境變量)

在新建項(xiàng)目(名為“EnvironmentVariablesCfg”)中的Project.json中增加以下的依賴:

"Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-rc1-final",

"Microsoft.Extensions.Configuration.Binder": "1.0.0-rc1-final"

需要注意的是該依賴庫(kù)為全局依賴庫(kù),非dnx451或dnxcore50下的依賴庫(kù)。

?

跟之前的格式一樣,我們這里先通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)講述如何使用。相信很多新建過(guò).NET Core項(xiàng)目的人都曾看到屬性窗口中的“環(huán)境變量”,但是卻不知道如何使用,而本節(jié)我們將會(huì)利用它讀取對(duì)應(yīng)的配置信息。首先我們?cè)谄渲行陆ㄒ粋€(gè)值:

然后我們打開(kāi)Program.cs寫(xiě)入以下的程序:

public static void Main(string[] args) {var provider = new EnvironmentVariablesConfigurationProvider();provider.Load();string value = null;provider.TryGet("con", out value);Console.WriteLine($"con={value}");Console.ReadKey(); }

我們可以看到跟上一節(jié)的方式是一模一樣的,這樣對(duì)于我們今后自己進(jìn)行擴(kuò)展來(lái)說(shuō),就避免的我們系統(tǒng)內(nèi)部的修改。

?

如果讀者細(xì)心查看provider中的Data會(huì)發(fā)現(xiàn)其中不僅僅保存我們的配置信息還保存了大量的系統(tǒng)配置信息,這是因?yàn)樵谡{(diào)用Load的時(shí)候內(nèi)部還將系統(tǒng)配置信息也讀取了,對(duì)應(yīng)的源碼如下:

public override void Load() {Load(Environment.GetEnvironmentVariables()); }

在我們初始化provider時(shí)可以看到構(gòu)造函數(shù)還支持prefix,那么下面我們利用prefix來(lái)定義一個(gè)擁有自己前綴的配置避免跟其他的配置信息相互沖突:

var provider = new EnvironmentVariablesConfigurationProvider("cfg:"); provider.Load();string value = null; provider.TryGet("con", out value); Console.WriteLine($"con={value}");Console.ReadKey();

讀者還要記得到項(xiàng)目的屬性中將環(huán)境配置中的變量的key改成cfg:Con,否則value獲取出來(lái)的就是null了。

?

相信聰明的讀者已經(jīng)知道對(duì)應(yīng)的如何使用了,所以筆者在這里只列出對(duì)應(yīng)的代碼(兩種方式)。

public class EnvirVarCfg{public string Con { get; set; }}

?

?

方式1:

var provider = new EnvironmentVariablesConfigurationProvider("cfg:"); var builder = new ConfigurationBuilder(); builder.Add(provider); var item = builder.Build().Get<EnvirVarCfg>(); Console.WriteLine($"con={item.Con}");

?

?

方式2:

var builder = new ConfigurationBuilder(); builder.AddEnvironmentVariables("cfg:"); var item = builder.Build().Get<EnvirVarCfg>(); Console.WriteLine($"con={item.Con}");

?

至此環(huán)境變量這節(jié)就結(jié)束了,如果已經(jīng)掌握規(guī)律的讀者下面三節(jié)應(yīng)該很快就能夠掌握了。

?

C. Ini

在新建的項(xiàng)目(名為“IniCfg”)中的Project.json中增加以下的依賴:

"Microsoft.Extensions.Configuration.Ini": "1.0.0-rc1-final",

"Microsoft.Extensions.Configuration.Binder": "1.0.0-rc1-final"

需要注意的是該依賴庫(kù)為全局依賴庫(kù),非dnx451或dnxcore50下的依賴庫(kù)。

?

首先我們?cè)陧?xiàng)目根目錄下新建一個(gè)“config.ini”文件,并在其中寫(xiě)入如下的內(nèi)容以便我們讀取:

[SegOne] Con=localhost[SegTwo] Con=192.168.1.113 Ext:Port=5535[Seg:Three] Con=192.169.12.12

然后我們打開(kāi)Program.cs文件寫(xiě)入如下代碼去讀取配置文件中的內(nèi)容:

1 public static void Main(string[] args) 2 { 3 string path = Path.Combine(Directory.GetCurrentDirectory(), "config.ini"); 4 var provider = new IniConfigurationProvider(path); 5 provider.Load(); 6 7 string segoneCon = null; 8 provider.TryGet("SegOne:Con", out segoneCon); 9 Console.WriteLine($"SegOne-Con={segoneCon}"); 10 11 string segtwoCon = null; 12 provider.TryGet("SegTwo:Con", out segtwoCon); 13 Console.WriteLine($"SegTwo-Con={segtwoCon}"); 14 15 string segtwoExtPort = null; 16 provider.TryGet("SegTwo:Ext:Port", out segtwoExtPort); 17 Console.WriteLine($"SegTwo-Ext:Port={segtwoExtPort}"); 18 19 string segthreeCon = null; 20 provider.TryGet("Seg:Three:Con", out segthreeCon); 21 Console.WriteLine($"Seg:Three-Con={segthreeCon}"); 22 23 Console.ReadKey(); 24 } View Code

?

相同很多人都看見(jiàn)過(guò)類(lèi)似的配置文件,特別是在搭建一些服務(wù)的時(shí)候,那么從.net core開(kāi)始也將原生支持這些配置,當(dāng)然上面的示例中沒(méi)有給出對(duì)應(yīng)的注釋,對(duì)應(yīng)的注釋要以“;”、“#”和“/”開(kāi)頭即可。

?

因?yàn)樵谠摻Y(jié)構(gòu)下會(huì)存在復(fù)雜類(lèi)型包含復(fù)雜類(lèi)型的情況,所以下面我們的模型可能比較復(fù)雜:

1 public class IniModelCfg 2 { 3 public SegOne SegOne { get; set; } 4 public SegTwo SegTwo { get; set; } 5 public Seg Seg { get; set; } 6 } 7 8 public class SegOne 9 { 10 public string Con { get; set; } 11 } 12 13 public class SegTwo 14 { 15 public string Con { get; set; } 16 public Ext Ext { get; set; } 17 } 18 19 public class Ext 20 { 21 public string Port { get; set; } 22 } 23 24 public class Seg 25 { 26 public Three Three { get; set; } 27 } 28 29 public class Three 30 { 31 public string Con { get; set; } 32 } View Code

?

?

第一種實(shí)現(xiàn)方式:

string path = Path.Combine(Directory.GetCurrentDirectory(), "config.ini");var provider = new IniConfigurationProvider(path);var builder = new ConfigurationBuilder();builder.Add(provider);var item = builder.Build().Get<IniModelCfg>();Console.WriteLine($"SegOne-Con={item.SegOne.Con}");Console.WriteLine($"SegTwo-Con={item.SegTwo.Con}");Console.WriteLine($"SegTwo-Ext:Port={item.SegTwo.Ext.Port}");Console.WriteLine($"Seg:Three-Con={item.Seg.Three.Con}");

?

?

第二種實(shí)現(xiàn)方式:

string path = Path.Combine(Directory.GetCurrentDirectory(), "config.ini");var builder = new ConfigurationBuilder();builder.AddIniFile(path);var item = builder.Build().Get<IniModelCfg>();Console.WriteLine($"SegOne-Con={item.SegOne.Con}");Console.WriteLine($"SegTwo-Con={item.SegTwo.Con}");Console.WriteLine($"SegTwo-Ext:Port={item.SegTwo.Ext.Port}");Console.WriteLine($"Seg:Three-Con={item.Seg.Three.Con}");

?

?

D. Json

在新建的項(xiàng)目(名為“JsonCfg”)中的Project.json中增加以下的依賴:

"Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final",

"Microsoft.Extensions.Configuration.Binder": "1.0.0-rc1-final"

需要注意的是該依賴庫(kù)為全局依賴庫(kù),非dnx451或dnxcore50下的依賴庫(kù)。

?

首先我們?cè)陧?xiàng)目根目錄下新建一個(gè)“config.json”文件并在其中寫(xiě)入如下的內(nèi)容以便測(cè)試:

{"url": "localhost","port": {"one": 1234,"two": 456} }

?

然后打開(kāi)Program.cs文件并在其中寫(xiě)入如下內(nèi)容:

string path = Path.Combine(Directory.GetCurrentDirectory(), "config.json");var provider = new JsonConfigurationProvider(path);provider.Load();string url = null;provider.TryGet("url", out url);Console.WriteLine($"url={url}");string one = null;provider.TryGet("port:one", out one);Console.WriteLine($"port-one={one}");string two = null;provider.TryGet("port:two", out two);Console.WriteLine($"port0two={two}");Console.ReadKey();

如何獲取某個(gè)元素的元素跟Ini方式下是統(tǒng)一的,都是通過(guò)冒號(hào)來(lái)分割。

?

基本跟之前的還是一樣的,筆者還是會(huì)給出對(duì)應(yīng)的代碼,首先是模型相關(guān)的代碼:

1 public class JsonModelCfg 2 { 3 public string Url { get; set; } 4 public Port Port { get; set; } 5 } 6 7 public class Port 8 { 9 public string One { get; set; } 10 public string Two { get; set; } 11 } View Code

?

?

第一種實(shí)現(xiàn)方式:

string path = Path.Combine(Directory.GetCurrentDirectory(), "config.json");var provider = new JsonConfigurationProvider(path);var builder = new ConfigurationBuilder();builder.Add(provider);var item = builder.Build().Get<JsonModelCfg>();Console.WriteLine($"url={item.Url}");Console.WriteLine($"port-one={item.Port.One}");Console.WriteLine($"port-two={item.Port.Two}");

?

?

第二種實(shí)現(xiàn)方式:

1 string path = Path.Combine(Directory.GetCurrentDirectory(), "config.json"); 2 var builder = new ConfigurationBuilder(); 3 builder.AddJsonFile(path); 4 var item = builder.Build().Get<JsonModelCfg>(); 5 6 Console.WriteLine($"url={item.Url}"); 7 Console.WriteLine($"port-one={item.Port.One}"); 8 Console.WriteLine($"port-two={item.Port.Two}"); View Code

?

?

E. Xml

在新建的項(xiàng)目(名為“XmlCfg”)中的Project.json中增加以下的依賴:

"Microsoft.Extensions.Configuration.Xml": "1.0.0-rc1-final",

"Microsoft.Extensions.Configuration.Binder": "1.0.0-rc1-final"

需要注意的是該依賴庫(kù)為全局依賴庫(kù),非dnx451或dnxcore50下的依賴庫(kù)。

?

在項(xiàng)目根目錄下新建一個(gè)“config.xml”文件并在其中寫(xiě)入如下內(nèi)容以便后面的測(cè)試:

<settings><data><con>123456</con></data><inventory value="test" /> </settings>

然后打開(kāi)Program.cs文件并在其中寫(xiě)入如下代碼:

string path = Path.Combine(Directory.GetCurrentDirectory(), "config.xml");var provider = new XmlConfigurationProvider(path);provider.Load();string con = null;provider.TryGet("data:con", out con);Console.WriteLine($"con={con}");string name = null;provider.TryGet("inventory:value", out name);Console.WriteLine($"value={name}");Console.ReadKey();

?

對(duì)應(yīng)的模型綁定就不再重復(fù)了,完全一模一樣了。至此所有的配置相關(guān)的內(nèi)容就介紹完畢了。

?

總結(jié)

以上是生活随笔為你收集整理的.Net Core下如何管理配置文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。