傳統配置方式
- 文件Web.config 進行配置。
- ConfigurationManager類配置。
.NET配置系統中支持配置方式
- 文件配置(json、xml、ini等)
- 注冊表
- 環境變量
- 命令行
- 自定義配置源
Json文件配置方式
實現步驟:
- 創建一個json文件,把文件設置 為“如果較新則復制”,這樣編譯后的文件會復制一份到bin目錄下。
{"name": "wangxiaohua","exclude": ["**/bin","**/bower_components","**/jspm_packages","**/node_modules","**/obj","**/platforms"],"proxy":{"key": "value","age": 88} }
- Nuget安裝
- Microsoft.Extensions.Configuration 配置框架基礎包
- Microsoft.Extensions.Configuration.Json 讀取json配置文件包
- 編寫代碼讀取配置。
namespace ConsoleApp1 {internal class Program{static void Main(string[] args){//創建配置構造器ConfigurationBuilder builder = new ConfigurationBuilder();//添加需要被讀取的json文件,//optional參數是文件不存在是否報錯//reloadOnChange配置文件被更新時是否重新加載配置文件builder.AddJsonFile("config.json", optional: true, reloadOnChange: true);//獲得配置層級的根層級IConfigurationRoot confRoot = builder.Build();string name = confRoot["name"];Console.WriteLine($"name={name}");string value =confRoot.GetSection("proxy:key").Value;Console.WriteLine($"value={value}");Console.ReadKey();}} }
對象映射方式讀取json文件
? ? ? ? 例如:
? ? ? ? 將配置內容映射成對象
{
“name”:"wangwu",
"age":99,
"proxy":{"address":"192.168.0.1","port":"80"}}
創建一個類文件,屬性和配置文件中key相對應
//把整個配置文件映射成一個對象
class Config { public string Name { get; set; }public int Age { get; set; }public Proxy Proxy { get; set; }}//將proxy中的內容映射成一個類class Proxy { public string Address { get; set; }public string Port { get; set; }}
讀取映射類,讀取之前需要先安裝NuGet包:Microsoft.Extensions.Configuration.Binder
namespace ConsoleApp1
{internal class Program{static void Main(string[] args){//創建配置構造器ConfigurationBuilder builder = new ConfigurationBuilder();//添加需要被讀取的json文件,//optional參數是文件不存在是否報錯//reloadOnChange配置文件被更新時是否重新加載配置文件builder.AddJsonFile("config.json", optional: true, reloadOnChange: true);//獲得配置層級的根層級IConfigurationRoot confRoot = builder.Build();Config config =confRoot.Get<Config>();//獲取配置文件中name的值Console.WriteLine(config.Name);//獲取配置文件中port的值Console.WriteLine(config.Proxy.port)//讀取指定對象Porxy porxy =confRoot.GetSection("porxy").Get<Porxy>();}}
}
使用選項方式讀取配置文件(推薦)
首先需要安裝Nuget包:
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.Json
Microsoft.Extensions.Configuration.Binder
Microsoft.Extensions.Options
然后再讀取配置文件時候,需要使用到DI注入IOptions<T>、IOptionsMonitor<T>、IOptionsSnapshot<T>類型。
IOptions<T>不會讀取到更新的值
IOptionsSnapshot<T> 在一定的范圍內讀取的是原來的值
IOptionsMonitor<T> 立即讀取到更新值
創建一個類文件:在這個文件中注入IOptionsSnapshot<T> 接口
class OptionsConfig
{//聲明IOptionsSnapshot private readonly IOptionsSnapshot<Config> options;//使用構造方法方式進行注入public OptionsConfig(IOptionsSnapshot<Config> options) { this.options = options;}public void Test() {Config config =options.Value;Console.WriteLine(config.Name);}}
在使用讀取配置文件
static void Main(string[] args){//創建DI容器對象ServiceCollection services = new ServiceCollection();//將OptionsConfig類注冊到容器對象中services.AddScoped<OptionsConfig>();//創建配置構造器ConfigurationBuilder builder = new ConfigurationBuilder();//添加需要被讀取的json文件,//optional參數是文件不存在是否報錯//reloadOnChange配置文件被更新時是否重新加載配置文件builder.AddJsonFile("config.json", optional: true, reloadOnChange: true);//獲得配置層級的根層級IConfigurationRoot confRoot = builder.Build();//添加選項所需的服務,把文件和節點進行綁定// services.AddOptions().Configure<Config>(e=>confRoot.GetSection("proxy").Bind(e));//使用Bind 需要安裝 Microsoft.Extensions.Configuration.Binder 包IServiceCollection serviceCollection = services.AddOptions().Configure<Config>(e=>confRoot.Bind(e));using (var sp =services.BuildServiceProvider()) {OptionsConfig config = sp.GetRequiredService<OptionsConfig>();config.Test();}Console.ReadKey();}
命令行方式進行配置:
需要安裝包:Microsoft.Extensions.Configuration.CommandLine
static void Main(string[] args){//創建DI容器對象ServiceCollection services = new ServiceCollection();//將OptionsConfig類注冊到容器對象中services.AddScoped<OptionsConfig>();//創建配置構造器ConfigurationBuilder builder = new ConfigurationBuilder();//---------------把原來添加讀取JSON文件更換成命令行------------------builder.AddCommandLine(args); //----------------------------------//獲得配置層級的根層級IConfigurationRoot confRoot = builder.Build();//添加選項所需的服務,把文件和節點進行綁定// services.AddOptions().Configure<Config>(e=>confRoot.GetSection("proxy").Bind(e));//使用Bind 需要安裝 Microsoft.Extensions.Configuration.Binder 包IServiceCollection serviceCollection = services.AddOptions().Configure<Config>(e=>confRoot.Bind(e));using (var sp =services.BuildServiceProvider()) {OptionsConfig config = sp.GetRequiredService<OptionsConfig>();config.Test();}Console.ReadKey();}
使用時候就是在cmd窗口中使用,應用程序加參數方式。
調試時可以直接在IDE進行傳遞參數:
在項目上右鍵鼠標選擇“屬性”
在選擇“調試” --》“啟動配置文件”
直接在命令行參數中填寫需要傳遞的參數
參數的扁平化配置(扁平就是把每個參數都展開)
如果在命令行中傳遞的不是簡單是鍵值對,是比較復雜的對象或數組
對象屬性傳參格式:
? ? ? 類名:屬性名=值
對象的數組傳參格式:
? ? ? ? 類名:屬性名:數組下標 = 值
class Proxy { public string Address { get; set; }public string Port { get; set; }public int[] Ids {get;set;}}
比如上面的模型類是一個對象,對象中還有數組,在命令行中就需要使用到扁平化傳參數。
傳遞參數應該是:
環境變量讀取參數配置
1.首先也是需要安裝Nuget包:
????????Microsoft.Extensions.Configuration.EnvironmentVariables
2.然后調用環境變量參數函數:configurationBuilder.AddEnvironmentVariables(),這個函數有無參數和有參數prefix參數重載版本。建議調用prefix版本(帶前綴區別環境變量),加載參數時候會忽略prefix參數不會和系統配置環境變量沖突。
static void Main(string[] args){//創建DI容器對象ServiceCollection services = new ServiceCollection();//將OptionsConfig類注冊到容器對象中services.AddScoped<OptionsConfig>();//創建配置構造器ConfigurationBuilder builder = new ConfigurationBuilder();//---------------把原來添加讀取JSON文件更換成環境變量配置方式------------------//----------------------------環境變量配置方式-------------------------------builder.AddEnvironmentVariables();//----------------------------------//獲得配置層級的根層級IConfigurationRoot confRoot = builder.Build();//添加選項所需的服務,把文件和節點進行綁定// services.AddOptions().Configure<Config>(e=>confRoot.GetSection("proxy").Bind(e));//使用Bind 需要安裝 Microsoft.Extensions.Configuration.Binder 包IServiceCollection serviceCollection = services.AddOptions().Configure<Config>(e=>confRoot.Bind(e));using (var sp =services.BuildServiceProvider()) {OptionsConfig config = sp.GetRequiredService<OptionsConfig>();config.Test();}Console.ReadKey();}
3.設置環境變量鍵值對:
ide調試參數配置:
部署環境,需要在 ”我的電腦” --》屬性--》高級--》環境變量中進行配置
開發自定義配置步驟
1.自己開發類需要實現IConfigurationProvider接口
? ? ? ?實現 IConfigurationProvider的類有?ConfigurationProvider 和FileConfigurationProvider,重寫Load方法,把數據扁平化設置到Data屬性中即可。
2.在開發一個實現IConfigurationSource接口的類。讀取文件可以繼承類 FileConfigurationSource在重寫Build方法中返回上面的ConfigurationProvider對象。
3.然后把ConfigurationSource對象加入到IConfigurationBuilder中 ,configurationBuilder.Add(new ConfigurationSource())