大家好,我是張飛洪,感謝您的閱讀,我會不定期和你分享學習心得,希望我的文章能成爲你成長路上的墊腳石,讓我們一起精進。
本文的主題是應用程序配置。要介紹的是如何使用配置、如何自定義配置,以採用不同的方式配置。也許您已經有了現有的XML配置,或者希望在不同的應用上共享YAML配置文件,或者從數據庫中讀取配置值,總之,配置是我們繞不開的話題。
本文,我們將討論以下主題:
- 設置配置文件
- 使用類型化配置
- 使用初始化(INI)文件進行配置
- 配置提供程序
本文中的主題仍然是處在ASP.NET Core
的Host
層:
2.1設置配置文件
讓我們從各種配置選項開始,自ASP.NET Core2.0
,爲了確保Startup.cs
的乾淨和簡單,配置被隱藏在WebHostBuilder
的默認配置中,不再是Startup.cs
的一部分。
在ASP.NET Core3.1到ASP.NET Core 5.0
,代碼如下所示:
public class Program {
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args).
ConfigureWebHostDefaults(webBuilder =>{
webBuilder.UseStartup();
}
}
在ASP.NET Core 6.0
中,爲了進一步的簡化,Microsoft
引入了最小應用程序編程接口(API)方法:去除Startup.cs
文件,把所有的配置放在在Program.cs
文件中,讓我們看看是什麼樣子:
Var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews();
var app = builder.Build();
上面兩個版本都自帶默認配置,也支持自定義配置。我們可以使用ConfigureAppConfiguration()
方法擴展了IWebHostBuilder
。
下面是ASP.NET Core3.1到ASP.NET Core 5.0中的
使用最小API方法時的定製代碼:
Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureAppConfiguration((builderContext,config) =>
{
//這裏是配置內容
}).UseStartup();
});
您還可以使用ConfigureAppConfiguration
來配置應用程序配置:
builder.WebHost.ConfigureAppConfiguration((builderContext, config) =>
{
//這裏是配置內容
});
還有一種更簡單的方法,通過訪問builder
的Configuration
屬性:
builder.Configuration.AddJsonFile("appsettings.json",optional: false,reloadOnChange: true);
當我們創建ASP.NET Core
項目,會生成一些默認的配置文件,比如appsettings.json
和appsettings.Development.json
,大多數ASP.NET Core
開發人員會使用默認的配置文件來配置。
以下展示了一段用於讀取appsettings.json
的默認代碼:
var env = builder.Environment;
builder.Configuration.SetBasePath(env.ContentRootPath);
builder.Configuration.AddJsonFile("appsettings.json",optional: false,reloadOnChange:true);
builder.Configuration.AddJsonFile($"appsettings.{env.EnvironmentName}.json",optional:true,reloadOnChange:true);
builder.Configuration.AddEnvironmentVariables();
該配置通過環境變量設置了應用程序的基本路徑,這裏使用AddEnvironmentVariables()
配置方法是一種最佳實踐。另外,配置順序也很重要,後添加的配置將覆蓋之前添加的配置,這裏的環境變量始終做最後的覆蓋。
IConfigurationBuilder
有很多擴展方法可以添加更多配置,例如XML或INI配置文件和內存配置,甚至您也可以在社區了找到的其他配置提供程序,以讀取YAML文件、數據庫值等。
2.2 使用類型化配置
在嘗試讀取INI
文件之前,有必要了解如何使用類型化配置,而不是通過IConfiguration
逐鍵讀取配置。要讀取類型化配置,需要定義待配置的類型。假設我們創建一個名爲AppSettings
的類,如下所示:
namespace ConfigureSample;
public class AppSettings {
public int Foo { get; set; }
public string Bar { get; set; }
}
這是一個簡單的POCO類,然後,我們可以在Startup.cs
的ConfigureServices
方法內填充這些類。直到ASP。NET Core 5.0:
services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
使用迷你API(minimal API
)方法,配置如下所示:
builder.Services.Configure<AppSettings>(builder.Configuration.GetSection("AppSettings"));
這樣,類型化配置也可以在依賴注入(DI)容器中註冊爲服務,並且可以在應用程序中的任何地方使用。您可以爲每個配置創建不同的配置類型。在大多數情況下,一個配置足以應對,但有時爲了需要會將配置劃分爲不同的配置。
下面的代碼演示瞭如何在MVC控制器中使用類型配置:
using Microsoft.Extensions.Options;
// ...
public class HomeController : Controller {
private readonly AppSettings _options;
public HomeController(IOptions<AppSettings> options)
{
_options = options.Value;
}
public IActionResult Index()
{
ViewData["Message"] = _options.Bar;
return View();
}
}
IOptions
是AppSettings
類型的包裝器,Value
屬性包含AppSettings
類的實例,包括配置文件中的值。
要讀取設置,需要先在appsettings.json
文件中配置AppSettings
部分,否則值將爲null
或未設置。現在,讓我們將該部分添加到appsettings.json
文件,如下所示:
{
"Logging": { "LogLevel": { "Default": "Warning" }},
"AllowedHosts": "*",
"AppSettings": {"Foo": 123,"Bar": "Bar"}
}
2.3 使用INI文件進行配置
要使用INI
文件來配置應用程序,您需要在Program.cs
的ConfigureAppConfiguration()
方法中添加INI
配置,如下所示:
builder.Configuration.AddIniFile("appsettings.ini",optional: false,reloadOnChange: true);
builder.Configuration.AddJsonFile($"appsettings.{env.EnvironmentName}.ini", optional: true, reloadOnChange: true);
此代碼以與JSON
配置文件加載方式相同。第一行是必需的配置,第二行是可選的配置,具體取決於當前運行時環境。
INI文件可能如下所示:
[AppSettings] Bar="FooBar"
此文件包含一個名爲AppSettings
和一個名爲Bar
的屬性。
前面我們說過,配置的順序很重要。如果通過JSON
文件進行配置之後再添加兩行有關INI
文件的配置,INI
文件將覆蓋JSON
文件中的設置,Bar
屬性值將被FooBar
覆蓋。此外,INI
文件中的值將通過之前創建的類型化配置提供。
其他所有配置提供程序都將以相同的機制工作。
2.4 配置提供程序
配置提供程序是IConfigurationProvider
的實現,它是由配置源創建的(配置源是IConfigurationSource
的實現)。配置提供程序從配置源頭讀取數據,並通過字典對外提供數據。
將自定義或第三方配置提供程序添加到ASP.NET Core
中,您需要調用ConfigurationBuilder
上的Add
方法添加配置源:
// add new configuration source
builder.Configuration.Add(new MyCustomConfigurationSource {
SourceConfig = //配置數據來源
Optional = false,
ReloadOnChange = true
});
通常,我們會創建一個擴展方法來更優雅地添加配置源,如下所示:
builder.Configuration.AddMyCustomSource("source", optional: false, reloadOnChange: true);
2.4 回顧
其實在大多數情況下,我們不需要添加其他配置提供程序或創建自己的配置提供程序,但是爲了以防萬一,但最好知道如何定製它。此外,使用類型化配置是讀取和提供設置的好方法。在經典的ASP.NET
中,我們往往使用手動的方式讀取配置,現在,我們只需提供一個類型即可自動完成此操作,因爲該類型將通過DI自動實例化。