ASP.NET Core中的配置
配置
參考文件點擊跳轉
配置來源
- 命令行參數
- 自定義提供程序
- 目錄文件
- 環境變量
- 內存中的.NET 對象
文件
默認配置
- CreateDefaultBuilder方法提供有默認配置,在這個方法中會接收前綴為ASPNETCORE_的變量和命令行參數以及appsettings.json和appsettings.{Environment}.json等,可以通過下面的源碼看到,注意配置文件的順序
- 一般順序為
命令行參數可以更新替換相關的程序設置,與前面提到的順序有關,詳細見下面的約定
public static IWebHostBuilder CreateDefaultBuilder(string[] args){var builder = new WebHostBuilder();if (string.IsNullOrEmpty(builder.GetSetting(WebHostDefaults.ContentRootKey))){builder.UseContentRoot(Directory.GetCurrentDirectory());}if (args != null){builder.UseConfiguration(new ConfigurationBuilder().AddCommandLine(args).Build());}builder.UseKestrel((builderContext, options) =>{options.Configure(builderContext.Configuration.GetSection("Kestrel"));}).ConfigureAppConfiguration((hostingContext, config) =>{var env = hostingContext.HostingEnvironment;config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);if (env.IsDevelopment()){var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));if (appAssembly != null){config.AddUserSecrets(appAssembly, optional: true);}}config.AddEnvironmentVariables();if (args != null){config.AddCommandLine(args);}}).ConfigureLogging((hostingContext, logging) =>{logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));logging.AddConsole();logging.AddDebug();logging.AddEventSourceLogger();}).ConfigureServices((hostingContext, services) =>{// Fallbackservices.PostConfigure<HostFilteringOptions>(options =>{if (options.AllowedHosts == null || options.AllowedHosts.Count == 0){// "AllowedHosts": "localhost;127.0.0.1;[::1]"var hosts = hostingContext.Configuration["AllowedHosts"]?.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);// Fall back to "*" to disable.options.AllowedHosts = (hosts?.Length > 0 ? hosts : new[] { "*" });}});// Change notificationservices.AddSingleton<IOptionsChangeTokenSource<HostFilteringOptions>>(new ConfigurationChangeTokenSource<HostFilteringOptions>(hostingContext.Configuration));services.AddTransient<IStartupFilter, HostFilteringStartupFilter>();}).UseIIS().UseIISIntegration().UseDefaultServiceProvider((context, options) =>{options.ValidateScopes = context.HostingEnvironment.IsDevelopment();});return builder;}相關約定
- 鍵不區分大小寫,但是linux好像區分,所以最好還是有區分的好
- 同鍵值會被覆蓋,以最后的為準
- 環境變量中,冒號分隔不適應用所有的平臺,但是雙下劃線支持所有的平臺
- Azure中用兩個破折號,國內有阿里的比較多
- ConfigurationBinder支持配置到對象的轉換,有Bind和Get<>的兩種方式,注意區分,建議用Get
值是字符串且NULL不能出現在配置文件中也不能綁定到相應的對象中去
參數提供程序
主機通過ConfigureAppConfiguration指定應用配置程序
命令行參數提供程序
配置
- 其實CreateDefaultBuider已經支持了,但是如果需要應用程序配置并能實現覆蓋的功能就需要在CnfigureAppConfiguration中添加并且在最后添加AddCommandLine如下:
使用
- 命令行后有兩種賦值方式,等號和空格(鍵前必順有--或/),不要混合使用(知道的多不是讓你亂用的,你的明白)
- 等號賦值 值可以為null
- 交換映射
就是給命令行的鍵值改名,以-開頭的必順要交換,再加上默認提供程序沒有注入的地方,如果硬傳將造成格式異常,所以可以通過AddCommandLine在ConfigureAppConfiguration中進行傳遞
環境變量提供程序
注意:分隔無法適應所有的平臺,__可以,由加載順序可以知道環境變量是可以替換appsettings文件中的配置,注意默認的環境變量前綴是ASPNETCORE_所以為了區分自己添加的不要用這個前綴了,前綴盡量見名知義,一個結果 就是能自解
配置
與命令行一樣在ConfigureAppConfiguration中添加并聲明前綴,如下:
WebHost.CreateDefaultBuilder(args).ConfigureAppConfiguration((hostingContext, config) =>{// Call additional providers here as needed.// Call AddEnvironmentVariables last if you need to allow environment// variables to override values from other providers.config.AddEnvironmentVariables(prefix: "PREFIX_");}).UseStartup<Startup>(); //二種寫法 var config = new ConfigurationBuilder().AddEnvironmentVariables().Build();var host = new WebHostBuilder().UseConfiguration(config).UseKestrel().UseStartup<Startup>();使用
就是配置系統級的環境變量,不同的系統不太一樣,windows可以在屬性->環境變境中找到,linux可以命令行配置也可以直接改文件
文件配置提供程序(重點,重點,使用比較多)
首先明白不論何種文件,一定要能根據路徑找到,所以我們一定要通過SetBasePath設置基路徑,然后再是不同的文件
INI文件
配置
與前面的一樣也是在ConfigureAppConfiguration中添加
WebHost.CreateDefaultBuilder(args).ConfigureAppConfiguration((hostingContext, config) =>{config.SetBasePath(Directory.GetCurrentDirectory());config.AddIniFile("config.ini", optional: true, reloadOnChange: true);}).UseStartup<Startup>(); //二種 var config = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddIniFile("config.ini", optional: true, reloadOnChange: true).Build();var host = new WebHostBuilder().UseConfiguration(config).UseKestrel().UseStartup<Startup>();JSON文件
配置
WebHost.CreateDefaultBuilder(args).ConfigureAppConfiguration((hostingContext, config) =>{config.SetBasePath(Directory.GetCurrentDirectory());config.AddJsonFile("config.json", optional: true, reloadOnChange: true);}).UseStartup<Startup>(); //二種 var config = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("config.json", optional: true, reloadOnChange: true).Build();var host = new WebHostBuilder().UseConfiguration(config).UseKestrel().UseStartup<Startup>();XML文件
配置
WebHost.CreateDefaultBuilder(args).ConfigureAppConfiguration((hostingContext, config) =>{config.SetBasePath(Directory.GetCurrentDirectory());config.AddXmlFile("config.xml", optional: true, reloadOnChange: true);}).UseStartup<Startup>(); //另一種寫法(二種) var config = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddXmlFile("config.xml", optional: true, reloadOnChange: true).Build();var host = new WebHostBuilder().UseConfiguration(config).UseKestrel().UseStartup<Startup>();Key-pre-file配置提供程序
使用目錄的文件作為配置,鍵是文件名,值是包含在文件的內容。路徑必順是絕對路徑。雙下劃線字符 (__) 用作文件名中的配置鍵分隔符。 例如,文件名 Logging__LogLevel__System 生成配置鍵 Logging:LogLevel:System
配置
WebHost.CreateDefaultBuilder(args).ConfigureAppConfiguration((hostingContext, config) =>{config.SetBasePath(Directory.GetCurrentDirectory());var path = Path.Combine(Directory.GetCurrentDirectory(), "path/to/files");config.AddKeyPerFile(directoryPath: path, optional: true);}).UseStartup<Startup>(); //二種 var path = Path.Combine(Directory.GetCurrentDirectory(), "path/to/files"); var config = new ConfigurationBuilder().AddKeyPerFile(directoryPath: path, optional: true).Build();var host = new WebHostBuilder().UseConfiguration(config).UseKestrel().UseStartup<Startup>();內存配置提供程序
就是內存中的對象(字典對象之流)結構為IEnumerable<KeyValuePair<String,String>>
配置
public static readonly Dictionary<string, string> _dict = new Dictionary<string, string>{{"MemoryCollectionKey1", "value1"},{"MemoryCollectionKey2", "value2"}}; WebHost.CreateDefaultBuilder(args).ConfigureAppConfiguration((hostingContext, config) =>{config.AddInMemoryCollection(_dict);}).UseStartup<Startup>(); //二種 var dict = new Dictionary<string, string>{{"MemoryCollectionKey1", "value1"},{"MemoryCollectionKey2", "value2"}};var config = new ConfigurationBuilder().AddInMemoryCollection(dict).Build();var host = new WebHostBuilder().UseConfiguration(config).UseKestrel().UseStartup<Startup>();獲取配置內容
- GetSection 獲取指定子節鍵提取值
- GetChildren 獲取節點的值
- Bind 把字符串構造為POCO對象
- Get 綁定并返回指定類型 Get 比使用 Bind 更方便
綁定是按約定提供的。 不需要自定義配置提供程序實現數組綁定。
可以在代碼中讀到相應的值
var configEntryFilter = new string[] { "ASPNETCORE_", "urls", "Logging", "ENVIRONMENT", "contentRoot", "AllowedHosts", "applicationName", "CommandLine" };var config = cfg.AsEnumerable();FilteredConfiguration = config.Where(kvp => config.Any(i => configEntryFilter.Any(prefix => kvp.Key.StartsWith(prefix))));var starship = new Starship();cfg.GetSection("starship").Bind(starship);Starship = starship;TvShow = cfg.GetSection("tvshow").Get<TvShow>();ArrayExample = cfg.GetSection("array").Get<ArrayExample>();JsonArrayExample = cfg.GetSection("json_array").Get<JsonArrayExample>();Customer customer = cfg.GetSection("customer").Get<Customer>();var value1 = cfg.GetValue<object>("name", "read error");自定義配置提供程序
該示例應用演示了如何使用實體框架 (EF) 創建從數據庫讀取配置鍵值對的基本配置提供程序。
倒著分析(正分析看官文)
- 我們要添加一個配置到ConfigurationBuilder中(可以用擴展 AddEFConfiguration)
- 要擴展我們要有配置內容類來作為載體EFConfigurationContext
- 我們要用對應的內容解析類來提供解析 EFConfigurationProvider
- 最后我們要有解析出來對應的對象來進行綁定 EFConfigurationValue
-最后我們要注入到ConfigureServices和Configure中這樣就可以在指定的作用域內使用了
詳見我抄官網上的git源碼點擊跳轉,同樣官網上的源碼也是可以運行的。
轉載于:https://www.cnblogs.com/ants_double/p/10511863.html
總結
以上是生活随笔為你收集整理的ASP.NET Core中的配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue组件通信的7个方法
- 下一篇: 基于Spring cloud Ribbo