.NET Core爲咱們提供了一套用於配置的API,它爲程序提供了運行時從文件、命令行參數、環境變量等讀取配置的方法。配置都是鍵值對的形式,而且支持嵌套,.NET Core還內建了從配置反序列化爲POCO對象的支持。html
目前支持如下配置Provider:git
若是現有Provider不能知足你的使用場景,還容許自定義Provider,好比從數據庫中讀取。github
包管理器中搜索「Microsoft.Extensions.Configuration",全部與配置相關的包都會列舉出來數據庫
從包的名稱基本就能夠看出它的用途,好比Microsoft.Extensions.Configuration.Json
是Json配置的Provider,Microsoft.Extensions.Configuration.CommandLine
是命令行參數配置的Provider,還有.NET Core程序中使用User Secrets存儲敏感數據這篇文章中使用的Microsoft.Extensions.Configuration.UserSecrets
。json
Json配置,須要安裝Microsoft.Extensions.Configuration.Json
包。數組
命令行下安裝執行如下命令bash
dotnet add package Microsoft.Extensions.Configuration.Json -v 1.1.2
調用AddJsonFile把Json配置的Provider添加到ConfigurationBuilder中。app
class Program { public static IConfigurationRoot Configuration { get; set; } static void Main(string[] args) { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); Configuration = builder.Build(); } }
若是使用Xml或Ini,只需安裝相應的包,而後調用相應的擴展方法AddXmlFile("appsettings.xml)或AddIniFile("appsettings.ini")。ide
SetBasePath是指定從哪一個目錄開始查找appsettings.json。若是appsettings.json在configs目錄中,那麼調用AddJsonFile應該指定的路徑爲"configs/appsettings.json"。函數
下面是演示用的Json配置,後面會講解全部讀取它的方法
{ "AppId": "12345", "Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Debug", "System": "Information", "Microsoft": "Information" } }, "GrantTypes": [ { "Name": "authorization_code" }, { "Name": "password" }, { "Name": "client_credentials" } ] }
1.使用Key讀取
Configuration["AppId"]; // 結果 12345 Configuration["Logging:IncludeScopes"]; // 結果 false Configuration["Logging:LogLevel:Default"]; // 結果 Debug Configuration["GrantTypes:0:Name"]; // 結果 authorization_code
讀取嵌套的配置,使用冒號隔開;讀取數組形式的配置,使用數組的下標索引,0表示第一個。
如在其餘地方用到Configuration的時候,能夠經過構造函數注入IConfiguration。
首先配置IConfiguration的依賴
services.AddSingleton<IConfiguration>(Configuration);
而後在經過構造函數注入
private readonly IConfiguration _configuration; public GetConfig(IConfiguration configuration) { _configuration = configuration; }
2.使用GetValue<T>
這是一個擴展方法,使用它須要安裝Microsoft.Extensions.Configuration.Binder
包。
Configuration.GetValue<int>("AppId", 12345); // 結果 12345 Configuration.GetValue<bool>("Logging:IncludeScopes", false); // 結果 false Configuration.GetValue<string>("Logging:LogLevel:Default", "Debug"); // 結果 Debug Configuration.GetValue<string>("GrantTypes:0:Name", "authorize_code"); // 結果 authorization_code
GetValue方法的泛型形式有兩個重載,一個是GetValue
3.使用Options
這種方式須要安裝Microsoft.Extensions.Options.ConfigurationExtensions
包。
調用AddOptions()添加使用Options須要的服務。
services.AddOptions()
定義與配置對應的POCO類
public class MyOptions { public int AppId { get; set; } public LoggingOptions Logging { get; set; } public List<GrantType> GrantTypes { get; set; } public class GrantType { public string Name { get; set; } } } public class LoggingOptions { public bool IncludeScopes { get; set; } public LogLevelOptions LogLevel { get; set; } } public class LogLevelOptions { public string Default { get; set; } public string System { get; set; } public string Microsoft { get; set; } }
綁定整個配置到POCO對象上
services.Configure<MyOptions>(Configuration);
也能夠綁定特定節點的配置
services.Configure<LoggingOptions>(Configuration.GetSection("Logging"));
或
services.Configure<LogLevelOptions>(Configuration.GetSection("Logging:LogLevel"));
在須要用到配置的地方,經過構造函數注入,或者直接使用ServiceProvider獲取。
private readonly MyOptions _myOptions; public GetConfig(IOptions<MyOptions> myOptionsAccessor) { _myOptions = myOptionsAccessor.Value; }
或
var myOptionsAccessor = serviceProvider.GetService<IOptions<MyOptions>>(); var myOptions = myOptionsAccessor.Value;
4.使用Get<T>
Get<T>
是.NET Core 1.1才引入的。
var myOptions = Configuration.Get<MyOptions>();
或
var loggingOptions = Configuration.GetSection("Logging").Get<LoggingOptions>();
5.使用Bind
和Get<T>
相似,建議使用Get<T>
。
var myOptions = new MyOptions(); Configuration.Bind(myOptions);
或
var loggingOptions = new LoggingOptions(); Configuration.GetSection("Logging").Bind(loggingOptions);
IOptionsSnapshot
支持配置文件變化自動從新加載配置。使用IOptionsSnapshot
也很簡單,AddJsonFile有個重載,指定reloadOnChange:true便可。
var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("configs/appsettings.json", optional: false, reloadOnChange: true);
內存中配置調用AddInMemoryCollection(),其他和Json配置同樣。
var dict = new Dictionary<string, string> { {"AppId","12345"}, {"Logging:IncludeScopes","false"}, {"Logging:LogLevel:Default","Debug"}, {"Logging:LogLevel:System","Information"}, {"Logging:LogLevel:Microsoft","Information"}, {"GrantTypes:0:Name","authorization_code"}, {"GrantTypes:1:Name","password"}, {"GrantTypes:2:Name","client_credentials"} }; var builder = new ConfigurationBuilder() .AddInMemoryCollection(dict);
或
var builder = new ConfigurationBuilder() .AddInMemoryCollection(); Configuration["AppId"] = "12345";
命令行參數配置須要安裝Microsoft.Extensions.Configuration.CommandLine
包。
調用AddCommandLine()擴展方法將命令行配置Provider添加到ConfigurationBuilder中。
var builder = new ConfigurationBuilder() .AddCommandLine(args);
傳遞參數有兩種形式
dotnet run /AppId=12345
或
dotnet run --AppId 12345
若是爲--AppId提供一個縮寫的參數-a,那麼執行dotnet run -a 12345
會報在switch mappings中沒有-a定義的錯誤。
幸虧AddCommandLine還有一個重載,能夠傳一個switch mapping。
var builder = new ConfigurationBuilder() .AddCommandLine(args, new Dictionary<string, string> { {"-a","AppId"} });
這樣再運行下面的命令就不會報錯了。
dotnet run -a 12345
環境變量配置須要安裝Microsoft.Extensions.Configuration.EnvironmentVariables
包。
調用AddEnvironmentVariables()擴展方法將環境變量配置Provider添加到ConfigurationBuilder中。
var builder = new ConfigurationBuilder() .AddEnvironmentVariables();
獲取全部的環境變量
Environment.GetEnvironmentVariables();
根據名稱獲取環境變量
Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
自定義配置Provider須要繼承IConfigurationSource實現本身的配置源,以及繼承ConfigurationProvider,重寫Load方法。
關於自定義配置Provider,我寫了兩個開源包,Cxlt.Extensions.Configuration.EF和Cxlt.Extensions.Configuration.Yaml,經過這兩個項目,我會詳細講解如何實現本身的配置Provider。文章《實現本身的.NET Core配置Provider之EF》和《實現本身的.NET Core配置Provider之Yaml》過幾天也會發布。
.NET Core的配置API容許同時使用多個配置Provider。
var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("configs/appsettings.json") .AddXmlFile("configs/appsettings.xml") .AddCommandLine(args) .AddEnvironmentVariables();
若是兩個Provider都有相同的配置,那麼添加Provider的順序就很是重要了,由於後加入的會覆蓋前面的。
另外建議環境變量的配置Provider放到最後。
.NET Core的配置是很基礎的內容,學起來天然不難,基本上動手實踐一遍就能掌握。越是簡單的東西,在往後的開發中可能幫你節約不少時間。
若是這篇文章對你有幫助或有什麼問題,歡迎關注「chengxulvtu"公衆號。