做電商網(wǎng)站一般需要什么流程可以免費推廣的網(wǎng)站
在.net中的配置文件系統(tǒng)支持豐富的配置源,包括文件(json、xml、ini等)、注冊表、環(huán)境變量、命令行、Azure Key Vault等,還可以配置自定義配置源并跟蹤配置的改變,然后按照優(yōu)先級進行覆蓋,總之對文件的配置有很多方法,這里我們就舉幾個最常用的例子來講解。
目錄
config配置管理
選項方式讀取
配置提供方式
自定義配置
config配置管理
配置json文件:是目前最常用的配置文件格式,在.net中也有許多針對json文件格式進行處理的配置,這里我們可以直接在.net core項目中添加一個json文件,然后里面寫一些配置信息,如下:
{"name": "test-app","age": "20","proxy": {"address": "aaa"}
}
寫好config.json配置文件之后,我們需要右鍵其屬性然后設(shè)置一下復(fù)制到最新目錄的情況:
然后我們借助NuGet安裝兩個包,如下一個是對config配置的包,一個是對json操作的包:
然后我們執(zhí)行如下語句,通過ConfigurationBuilder加載一個json配置文件,從配置中讀取簡單的鍵值對(例如 "name")以及嵌套的配置項(例如 "proxy:address"),輸出讀取到的配置信息:
namespace Program
{class Program{static void Main(string[] args){ConfigurationBuilder configBuilder = new ConfigurationBuilder();configBuilder.AddJsonFile("config.json", optional: true, reloadOnChange: true);IConfiguration configRoot = configBuilder.Build();string name = configRoot["name"];Console.WriteLine($"name = {name}");string address = configRoot.GetSection("proxy:address").Value;Console.WriteLine($"address = {address}");Console.ReadKey();}}
}
得到的結(jié)果如下所示:
綁定讀取配置:當(dāng)然我們還可以綁定一個類去自動完成配置的讀取,首先我們先借助NuGet安裝如下一個包:
然后我們定義一個類來映射config中的proxy配置,然后通過Get方式拿到相應(yīng)數(shù)據(jù)展示:
namespace Program
{class Program{static void Main(string[] args){ConfigurationBuilder configBuilder = new ConfigurationBuilder();configBuilder.AddJsonFile("config.json", optional: true, reloadOnChange: true);IConfiguration configRoot = configBuilder.Build();Proxy proxy = configRoot.GetSection("proxy").Get<Proxy>();Console.WriteLine($"Proxy: address={proxy.Address} port={proxy.Port}");Console.ReadKey();}}class Proxy{public string Address { get; set; }public string Port { get; set; }}
}
得到的結(jié)果如下所示:?
當(dāng)然我們還可以直接通過Get拿到config中的數(shù)據(jù),通過定義相關(guān)的類然后設(shè)置對應(yīng)的類型即可:
選項方式讀取
在讀取文件中推薦使用選項方式進行讀取,和DI結(jié)合方式比較好且能更好的利用reloadonchange機制,這里除了上文我們需要安裝的三個包之外,這里我們還是需求安裝一下下面這個包:
讀取配置的時候,DI要聲明IOptions<T>、IOptionsMonitor<T>、IOptionsSnapshot<T>等類型,因為IOptions<T>不會讀取到新的值,和IOptionsMonitor<T>相比IOptionsSnapshot會在同一個范圍內(nèi)(.net core一個請求中)保持一致,因此建議使用IOptionsSnapshot<T>類型。
IOptionsSnapshot讀取:在讀取配置的地方,用IOptionsSnapshot<T>注入,不要在構(gòu)造函數(shù)里面直接讀取IOptionsSnapshot.Value而是在用到的地方再讀取,否則就無法更新變化,如下所示:
在TestController中使用依賴注入模式來管理和訪問配置,通過IOptionsSnapshot<Config>獲取配置文件中的值(例如 name 和 age):
namespace test
{class TestController{private readonly IOptionsSnapshot<Config> optConfig;public TestController(IOptionsSnapshot<Config> optConfig){this.optConfig = optConfig;}public void Test(){Console.WriteLine(optConfig.Value.name);Console.WriteLine(optConfig.Value.age);}}
}
接下來通過通過IOptions接口來讀取配置文件并將其注入到類中,
namespace Program
{class Program{static void Main(string[] args){ServiceCollection services = new ServiceCollection();services.AddScoped<TestController>();ConfigurationBuilder configBuilder = new ConfigurationBuilder();configBuilder.AddJsonFile("config.json", optional: true, reloadOnChange: true);IConfiguration configRoot = configBuilder.Build();services.AddOptions().Configure<Config>(e => configRoot.Bind(e));using(var sp = services.BuildServiceProvider()){var test = sp.GetRequiredService<TestController>();test.Test();}Console.ReadKey();}}class Config{public string name { get; set; }public string age { get; set; }public Proxy Proxy { get; set; }}class Proxy{public string Address { get; set; }public string Port { get; set; }}
}
如下執(zhí)行通過使用ServiceProvider獲取TestController實例,TestController在構(gòu)造時自動注入配置,最后TestController調(diào)用了Test()方法輸出配置文件中的name、age詳細信息:
配置提供方式
讀取調(diào)試參數(shù):配置文件除了上面講解的讀取config等配置文件的方式外,框架還支持從命令行參數(shù)、環(huán)境變量等地方讀取, 借助NuGet安裝如下的包進行使用:
安裝完包之后,我們將之前加載json文件的格式修改為命令行的形式,如下:
然后我們右鍵我們的項目選擇屬性,然后找到調(diào)試的按鈕,輸入相關(guān)的參數(shù)信息即可,對于環(huán)境變量或命令行等簡單的鍵值對結(jié)構(gòu),如果想要進行復(fù)雜結(jié)構(gòu)的配置,需要進行扁平化處理,對于配置的名字需要采用“層級配置”,例如:a:b:c 賦值的話這樣配置 a:b:c:0,例如:
name=zhangsan;age=18;proxy:address=aaa;proxy:port=80;
proxy:ids:0=3;proxy:ids:1=5;
輸入完成之后我們的項目會自動生成一個配置文件,然后我們運行項目之后就會打印該文件內(nèi)容:
讀取環(huán)境變量:如果想讀取環(huán)境變量中的數(shù)據(jù)的話,可以借助NuGet安裝如下的包
然后我們在環(huán)境變量中配置如下的數(shù)據(jù),VS調(diào)試時為了避免修改系統(tǒng)環(huán)境變量,可以直接在VS中設(shè)置環(huán)境變量的方法:
然后我們就可以我們在使用環(huán)境變量的函數(shù)獲取當(dāng)前環(huán)境變量的數(shù)據(jù),該函數(shù)是有參數(shù)和沒有參數(shù)兩種情況的,無參數(shù)版本會把程序相關(guān)的所有環(huán)境變量都加載進來,由于有可能和系統(tǒng)中已有的環(huán)境變量沖突,因此這邊可以建議使用有prefix參數(shù)進行配置讀取的,讀取配置的時候prefix參數(shù)會被忽略:
當(dāng)然.net core還支持其他配置源,例如ini、xml等格式的配置源,還支持在運行或調(diào)試時加載不同的json文件,而且還內(nèi)置了第三方支持中心化配置服務(wù)器,例如Azure、阿里云等,具體使用可以查詢相關(guān)文檔,這里不再贅述。
自定義配置
.net core中不建議使用.net framework里的web.config,不過仍繼續(xù)提供ConfigurationManager,不過官方?jīng)]有支持通過新的Configuration框架讀取方式,這里我們建議自行編寫一個自定義配置提供者,實際使用意義不大,主要還是了解讀取配置的方法。具體步驟如下:
編寫ConfigurationProvider類實際讀取配置:
開發(fā)一個直接或間接實現(xiàn)IConfigurationProvider接口的類xxxConfigurationProvider,一般繼承自ConfigurationProvider,如果是從文件讀取是可以繼承自FileConfigurationProvider,重寫Load方法把扁平化數(shù)據(jù)設(shè)置到Data屬性即可。
ConfigurationSource在Build中返回ConfigurationProvider對象:
開發(fā)一個實現(xiàn)IConfigurationSource接口的類xxxConfigurationSource,如果是從文件讀取可以繼承自FileConfigurationSource,在Build方法中返回上面的ConfigurationProvider對象。
ConfigurationSource對象加入IConfigurationBuilder:
使用configurationBuilder.Add(new ConfigurationSource())即可,為了簡化使用一般還提供一個IConfigurationBuilder的擴展方法。