1. 程式人生 > 其它 >定製ASP.NET 6.0的應用配置

定製ASP.NET 6.0的應用配置

大家好,我是張飛洪,感謝您的閱讀,我會不定期和你分享學習心得,希望我的文章能成為你成長路上的墊腳石,讓我們一起精進。

本文的主題是應用程式配置。要介紹的是如何使用配置、如何自定義配置,以採用不同的方式配置。也許您已經有了現有的XML配置,或者希望在不同的應用上共享YAML配置檔案,或者從資料庫中讀取配置值,總之,配置是我們繞不開的話題。

本文,我們將討論以下主題:

  • 設定配置檔案
  • 使用型別化配置
  • 使用初始化(INI)檔案進行配置
  • 配置提供程式

本文中的主題仍然是處在ASP.NET CoreHost層:

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) => 
{     
    //這裡是配置內容
});

還有一種更簡單的方法,通過訪問builderConfiguration屬性:

builder.Configuration.AddJsonFile("appsettings.json",optional: false,reloadOnChange: true);

當我們建立ASP.NET Core專案,會生成一些預設的配置檔案,比如appsettings.jsonappsettings.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.csConfigureServices方法內填充這些類。直到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();     
    }
}

IOptionsAppSettings型別的包裝器,Value屬性包含AppSettings類的例項,包括配置檔案中的值。

要讀取設定,需要先在appsettings.json檔案中配置AppSettings部分,否則值將為null或未設定。現在,讓我們將該部分新增到appsettings.json檔案,如下所示:

{
    "Logging": { "LogLevel": { "Default": "Warning" }},
    "AllowedHosts": "*", 
    "AppSettings": {"Foo": 123,"Bar": "Bar"} 
}

2.3 使用INI檔案進行配置

要使用INI檔案來配置應用程式,您需要在Program.csConfigureAppConfiguration()方法中新增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自動例項化。