ASP.NET Core 中的配置

2019-04-15 13:00 更新

ASP.NET Core 中的應用配置基于配置提供程序建立的鍵值對。 配置提供程序?qū)⑴渲脭?shù)據(jù)從各種配置源讀取到鍵值對:

  • Azure Key Vault
  • 命令行參數(shù)
  • (已安裝或已創(chuàng)建的)自定義提供程序
  • 目錄文件
  • 環(huán)境變量
  • 內(nèi)存中的 .NET 對象
  • 設置文件

選項模式是本主題中描述的配置概念的擴展。 選項使用類來表示相關設置的組。 有關使用選項模式的詳細信息,請參閱 ASP.NET Core 中的選項模式

查看或下載示例代碼如何下載

這三個包均包括在 Microsoft.AspNetCore.App 元包中。

主機與應用配置

在配置并啟動應用之前,配置并啟動主機。 主機負責應用程序啟動和生存期管理。 應用和主機均使用本主題中所述的配置提供程序進行配置。 主機配置鍵值對成為應用的全局配置的一部分。 有關在構建主機時如何使用配置提供程序以及配置源如何影響主機配置的詳細信息,請參閱主機。

默認配置

基于 ASP.NET Core dotnet 新模板的 Web 應用在生成主機時會調(diào)用 CreateDefaultBuilderCreateDefaultBuilder 按照以下順序為應用提供默認配置:

  • 主機配置通過以下方式提供:使用環(huán)境變量配置提供程序,通過前綴為 ASPNETCORE_(例如,ASPNETCORE_ENVIRONMENT)的環(huán)境變量提供。 在配置鍵值對加載后,前綴 (ASPNETCORE_) 會遭去除。使用 命令行配置提供程序,通過命令行參數(shù)提供。
  • 應用配置通過以下方式提供:使用文件配置提供程序,通過 appsettings.json 提供。使用文件配置提供程序,通過 appsettings.{Environment}.json 提供。應用在使用入口程序集的 Development 環(huán)境中運行時的機密管理器。使用 環(huán)境變量配置提供程序,通過環(huán)境變量提供。 如果使用的是自定義前綴(例如,帶有 .AddEnvironmentVariables(prefix: "PREFIX_") 的 PREFIX_),前綴在配置鍵值對加載后遭去除。使用 命令行配置提供程序,通過命令行參數(shù)提供。

本主題后面將介紹配置提供程序。 有關主機和 CreateDefaultBuilder 的更多信息,請參閱 ASP.NET Core Web 主機。

安全性

采用以下最佳實踐:

  • 請勿在配置提供程序代碼或純文本配置文件中存儲密碼或其他敏感數(shù)據(jù)。
  • 不要在開發(fā)或測試環(huán)境中使用生產(chǎn)機密。
  • 請在項目外部指定機密,避免將其意外提交到源代碼存儲庫。

詳細了解如何使用多個環(huán)境和管理使用 Secret Manager 的開發(fā)中的應用機密的安全存儲(包括使用環(huán)境變量存儲敏感數(shù)據(jù)的建議)。 Secret Manager 使用文件配置提供程序?qū)⒂脩魴C密存儲在本地系統(tǒng)上的 JSON 文件中。 本主題后面將介紹文件配置提供程序。

Azure Key Vault 是安全存儲應用機密的一種選擇。 有關更多信息,請參見在 ASP.NET Core 中的 azure 密鑰保管庫配置提供程序。

分層配置數(shù)據(jù)

配置 API 能夠通過在配置鍵中使用分隔符來展平分層數(shù)據(jù)以保持分層配置數(shù)據(jù)。

在以下 JSON 文件中,兩個節(jié)的結構化層次結構中存在四個鍵:

JSON

{
  "section0": {
    "key0": "value",
    "key1": "value"
  },
  "section1": {
    "key0": "value",
    "key1": "value"
  }
}

將文件讀入配置時,將創(chuàng)建唯一鍵以保持配置源的原始分層數(shù)據(jù)結構。 使用冒號 (:) 展平節(jié)和鍵以保持原始結構:

  • section0:key0
  • section0:key1
  • section1:key0
  • section1:key1

GetSection 和 GetChildren 方法可用于隔離各個節(jié)和配置數(shù)據(jù)中某節(jié)的子節(jié)。 稍后將在 GetSection、GetChildren 和 Exists 中介紹這些方法。 GetSection 在 Microsoft.Extensions.Configuration 包中,后者在 Microsoft.AspNetCore.App 元包中。

約定

在應用啟動時,將按照指定的配置提供程序的順序讀取配置源。

應用啟動后,在更改基礎設置文件時,文件配置提供程序可以重載配置。 本主題后面將介紹文件配置提供程序。

應用的依賴關系注入 (DI) 容器中提供了 IConfiguration。 IConfiguration 可注入到 Razor Pages PageModel 以獲取以下類的配置:

C#

// using Microsoft.Extensions.Configuration;

public class IndexModel : PageModel
{
    private readonly IConfiguration _config;

    public IndexModel(IConfiguration config)
    {
        _config = config;
    }

    // The _config local variable is used to obtain configuration 
    // throughout the class.
}

配置提供程序不能使用 DI,因為主機在設置這些提供程序時 DI 不可用。

配置鍵采用以下約定:

  • 鍵不區(qū)分大小寫。 例如,ConnectionString 和 connectionstring 被視為等效鍵。
  • 如果由相同或不同的配置提供程序設置相同鍵的值,則鍵上設置的最后一個值就是所使用的值。
  • 分層鍵在配置 API 中,冒號分隔符 (:) 適用于所有平臺。在環(huán)境變量中,冒號分隔符可能無法適用于所有平臺。 而所有平臺均支持采用雙下劃線 (__),并可以將其轉(zhuǎn)換為冒號。在 Azure Key Vault 中,分層鍵使用 --(兩個破折號)作為分隔符。 將機密加載到應用的配置中時,必須提供代碼以用冒號替換破折號。
  • ConfigurationBinder 支持使用配置鍵中的數(shù)組索引將數(shù)組綁定到對象。 數(shù)組綁定將在將數(shù)組綁定到類部分中進行介紹。

配置值采用以下約定:

  • 值是字符串。
  • NULL 值不能存儲在配置中或綁定到對象。

提供程序

下表顯示了 ASP.NET Core 應用可用的配置提供程序。

提供程序通過以下對象提供配置…
Azure Key Vault 配置提供程序(安全主題)Azure Key Vault
命令行配置提供程序命令行參數(shù)
自定義配置提供程序自定義源
環(huán)境變量配置提供程序環(huán)境變量
文件配置提供程序文件(INI、JSON、XML)
Key-per-file 配置提供程序目錄文件
內(nèi)存配置提供程序內(nèi)存中集合
用戶機密 (Secret Manager)(安全主題)用戶配置文件目錄中的文件

按照啟動時指定的配置提供程序的順序讀取配置源。 本主題中所述的配置提供程序按字母順序進行介紹,而不是按代碼排列順序進行介紹。 代碼中的配置提供程序應以特定順序排列以符合基礎配置源的優(yōu)先級。

配置提供程序的典型順序為:

  1. 文件(appsettings.json、appsettings.{Environment}.json,其中 {Environment} 是應用的當前托管環(huán)境)
  2. Azure 密鑰保管庫
  3. 用戶機密 (Secret Manager)(僅限開發(fā)環(huán)境中)
  4. 環(huán)境變量
  5. 命令行參數(shù)

通常的做法是將命令行配置提供程序置于一系列提供程序的末尾,以允許命令行參數(shù)替代由其他提供程序設置的配置。

在使用 CreateDefaultBuilder 初始化新的 WebHostBuilder 時,將使用此提供程序序列。 有關詳細信息,請參閱 Web 主機:設置主機。

ConfigureAppConfiguration

構建主機時調(diào)用 ConfigureAppConfiguration 以指定應用的配置提供程序以及 CreateDefaultBuilder自動添加的配置提供程序:

C#

public class Program
{
    public static Dictionary<string, string> arrayDict = new Dictionary<string, string>
        {
            {"array:entries:0", "value0"},
            {"array:entries:1", "value1"},
            {"array:entries:2", "value2"},
            {"array:entries:4", "value4"},
            {"array:entries:5", "value5"}
        };

    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.SetBasePath(Directory.GetCurrentDirectory());
                config.AddInMemoryCollection(arrayDict);
                config.AddJsonFile("json_array.json", optional: false, reloadOnChange: false);
                config.AddJsonFile("starship.json", optional: false, reloadOnChange: false);
                config.AddXmlFile("tvshow.xml", optional: false, reloadOnChange: false);
                config.AddEFConfiguration(options => options.UseInMemoryDatabase("InMemoryDb"));
                config.AddCommandLine(args);
            })
            .UseStartup<Startup>();
}

在應用啟動期間,可以使用 ConfigureAppConfiguration 中提供給應用的配置,包括 Startup.ConfigureServices。 有關詳細信息,請參閱在啟動期間訪問配置部分。

命令行配置提供程序

CommandLineConfigurationProvider 在運行時從命令行參數(shù)鍵值對加載配置。

要激活命令行配置,請在 ConfigurationBuilder 的實例上調(diào)用 AddCommandLine 擴展方法。

使用 CreateDefaultBuilder 初始化新的 WebHostBuilder 時會自動調(diào)用 AddCommandLine。 有關詳細信息,請參閱 Web 主機:設置主機。

此外,CreateDefaultBuilder 也會加載:

  • appsettings.json 和 appsettings.{Environment}.json 的可選配置。
  • 用戶機密 (Secret Manager)(在開發(fā)環(huán)境中)。
  • 環(huán)境變量。

CreateDefaultBuilder 最后添加命令行配置提供程序。 在運行時傳遞的命令行參數(shù)會替代由其他提供程序設置的配置。

CreateDefaultBuilder 在構造主機時起作用。 因此,CreateDefaultBuilder 激活的命令行配置可能會影響主機的配置方式。

構建主機時調(diào)用 ConfigureAppConfiguration 以指定應用的配置。

CreateDefaultBuilder 已經(jīng)調(diào)用了 AddCommandLine。 如果需要提供應用配置并仍然能夠使用命令行參數(shù)覆蓋該配置,請在 ConfigureAppConfiguration 中調(diào)用應用的其他提供程序并最后調(diào)用 AddCommandLine。

C#

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                // Call other providers here and call AddCommandLine last.
                config.AddCommandLine(args);
            })
            .UseStartup<Startup>();
}

直接創(chuàng)建 WebHostBuilder 時,請使用以下配置調(diào)用 UseConfiguration

C#

var config = new ConfigurationBuilder()
    // Call additional providers here as needed.
    // Call AddCommandLine last to allow arguments to override other configuration.
    .AddCommandLine(args)
    .Build();

var host = new WebHostBuilder()
    .UseConfiguration(config)
    .UseKestrel()
    .UseStartup<Startup>();

示例

示例應用利用靜態(tài)便捷方法 CreateDefaultBuilder 來生成主機,其中包括一個對 AddCommandLine的調(diào)用。

  1. 在項目的目錄中打開命令提示符。
  2. 為 dotnet run 命令提供命令行參數(shù) dotnet run CommandLineKey=CommandLineValue。
  3. 應用運行后,在 http://localhost:5000 打開應用的瀏覽器。
  4. 觀察輸出是否包含提供給 dotnet run 的配置命令行參數(shù)的鍵值對。

自變量

該值必須后跟一個等號 (=),否則當值后跟一個空格時,鍵必須具有前綴(-- 或 /)。 如果使用等號(例如,CommandLineKey=),則該值可以為 null。

鍵前綴示例
無前綴CommandLineKey1=value1
雙劃線 (--)--CommandLineKey2=value2, --CommandLineKey2 value2
正斜杠 (/)/CommandLineKey3=value3, /CommandLineKey3 value3

在同一命令中,不要將使用等號的命令行參數(shù)鍵值對與使用空格的鍵值對混合使用。

示例命令:

console

dotnet run CommandLineKey1=value1 --CommandLineKey2=value2 /CommandLineKey3=value3
dotnet run --CommandLineKey1 value1 /CommandLineKey2 value2
dotnet run CommandLineKey1= CommandLineKey2=value2

交換映射

交換映射支持鍵名替換邏輯。 使用 ConfigurationBuilder 手動構建配置時,可以為 AddCommandLine 方法提供交換替換字典。

當使用交換映射字典時,會檢查字典中是否有與命令行參數(shù)提供的鍵匹配的鍵。 如果在字典中找到命令行鍵,則傳回字典值(鍵替換)以將鍵值對設置為應用的配置。 對任何具有單劃線 (-) 前綴的命令行鍵而言,交換映射都是必需的。

交換映射字典鍵規(guī)則:

  • 交換必須以單劃線 (-) 或雙劃線 (--) 開頭。
  • 交換映射字典不得包含重復鍵。

構建主機時調(diào)用 ConfigureAppConfiguration 以指定應用的配置:

C#

public class Program
{
    public static readonly Dictionary<string, string> _switchMappings = 
        new Dictionary<string, string>
        {
            { "-CLKey1", "CommandLineKey1" },
            { "-CLKey2", "CommandLineKey2" }
        };

    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    // Do not pass the args to CreateDefaultBuilder
    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder()
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddCommandLine(args, _switchMappings);
            })
            .UseStartup<Startup>();
}

如前面的示例所示,當使用交換映射時,對 CreateDefaultBuilder 的調(diào)用不應傳遞參數(shù)。 CreateDefaultBuilder 方法的 AddCommandLine 調(diào)用不包括映射的交換,并且無法將交換映射字典傳遞給 CreateDefaultBuilder。 如果參數(shù)包含映射的交換并傳遞給 CreateDefaultBuilder,則其 AddCommandLine 提供程序無法使用 FormatException 進行初始化。 解決方案不是將參數(shù)傳遞給 CreateDefaultBuilder,而是允許 ConfigurationBuilder 方法的 AddCommandLine 方法處理參數(shù)和交換映射字典。

創(chuàng)建交換映射字典后,它將包含下表所示的數(shù)據(jù)。

-CLKey1CommandLineKey1
-CLKey2CommandLineKey2

如果在啟動應用時使用了交換映射的鍵,則配置將接收字典提供的密鑰上的配置值:

console

dotnet run -CLKey1=value1 -CLKey2=value2

運行上述命令后,配置包含下表中顯示的值。

CommandLineKey1value1
CommandLineKey2value2

環(huán)境變量配置提供程序

EnvironmentVariablesConfigurationProvider 在運行時從環(huán)境變量鍵值對加載配置。

要激活環(huán)境變量配置,請在 ConfigurationBuilder 的實例上調(diào)用 AddEnvironmentVariables 擴展方法。

在環(huán)境變量中使用分層鍵時,冒號分隔符 (:) 可能無法適用于所有平臺(例如 Bash)。 所有平臺均支持采用雙下劃線 (__),并可以用冒號替換。

借助 Azure 應用服務,用戶可以在 Azure 門戶中設置使用環(huán)境變量配置提供程序替代應用配置的環(huán)境變量。 有關詳細信息,請參閱 Azure 應用:使用 Azure 門戶替代應用配置。

初始化一個新的 WebHostBuilder 時,對于前綴為 ASPNETCORE_ 的環(huán)境變量,會自動調(diào)用 AddEnvironmentVariables。 有關詳細信息,請參閱 Web 主機:設置主機。

此外,CreateDefaultBuilder 也會加載:

  • 來自沒有前綴的環(huán)境變量的應用配置,方法是通過調(diào)用不帶前綴的 AddEnvironmentVariables。
  • appsettings.json 和 appsettings.{Environment}.json 的可選配置。
  • 用戶機密 (Secret Manager)(在開發(fā)環(huán)境中)。
  • 命令行參數(shù)。

環(huán)境變量配置提供程序是在配置已根據(jù)用戶機密和 appsettings 文件建立后調(diào)用。 在此位置調(diào)用提供程序允許在運行時讀取的環(huán)境變量替代由用戶機密和 appsettings 文件設置的配置。

構建主機時調(diào)用 ConfigureAppConfiguration 以指定應用的配置。

如果需要從其他環(huán)境變量提供應用配置,請在 ConfigureAppConfiguration 中調(diào)用應用的其他提供程序,并使用前綴調(diào)用 AddEnvironmentVariables。

C#

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        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>();
}

直接創(chuàng)建 WebHostBuilder 時,請使用以下配置調(diào)用 UseConfiguration

C#

var config = new ConfigurationBuilder()
    .AddEnvironmentVariables()
    .Build();

var host = new WebHostBuilder()
    .UseConfiguration(config)
    .UseKestrel()
    .UseStartup<Startup>();

示例

示例應用利用靜態(tài)便捷方法 CreateDefaultBuilder 來生成主機,其中包括一個對 AddEnvironmentVariables 的調(diào)用。

  1. 運行示例應用。 在 http://localhost:5000 打開應用的瀏覽器。
  2. 觀察輸出是否包含環(huán)境變量 ENVIRONMENT 的鍵值對。 該值反映了應用運行的環(huán)境,在本地運行時通常為 Development。

為了使應用呈現(xiàn)的環(huán)境變量列表簡短,應用將環(huán)境變量篩選為以下列內(nèi)容開頭的變量:

  • ASPNETCORE_
  • urls
  • 日志記錄
  • ENVIRONMENT
  • contentRoot
  • AllowedHosts
  • applicationName
  • CommandLine

如果希望公開應用可用的所有環(huán)境變量,請將 Pages/Index.cshtml.cs 中的 FilteredConfiguration 更改為以下內(nèi)容:

C#

FilteredConfiguration = _config.AsEnumerable();

前綴

為 AddEnvironmentVariables 方法提供前綴時,將篩選加載到應用的配置中的環(huán)境變量。 例如,要篩選前綴 CUSTOM_ 上的環(huán)境變量,請將前綴提供給配置提供程序:

C#

var config = new ConfigurationBuilder()
    .AddEnvironmentVariables("CUSTOM_")
    .Build();

創(chuàng)建配置鍵值對時,將去除前綴。

靜態(tài)便捷方法 CreateDefaultBuilder 創(chuàng)建一個 WebHostBuilder 以建立應用的主機。 創(chuàng)建 WebHostBuilder 時,它會在前綴為 ASPNETCORE_ 的環(huán)境變量中找到其主機配置。

連接字符串前綴

針對為應用環(huán)境配置 Azure 連接字符串所涉及的四個連接字符串環(huán)境變量,配置 API 具有特殊的處理規(guī)則。 如果沒有向 AddEnvironmentVariables 提供前綴,則具有表中所示前綴的環(huán)境變量將加載到應用中。

連接字符串前綴提供程序
CUSTOMCONNSTR_自定義提供程序
MYSQLCONNSTR_MySQL
SQLAZURECONNSTR_Azure SQL 數(shù)據(jù)庫
SQLCONNSTR_SQL Server

當發(fā)現(xiàn)環(huán)境變量并使用表中所示的四個前綴中的任何一個加載到配置中時:

  • 通過刪除環(huán)境變量前綴并添加配置鍵節(jié) (ConnectionStrings) 來創(chuàng)建配置鍵。
  • 創(chuàng)建一個新的配置鍵值對,表示數(shù)據(jù)庫連接提供程序(CUSTOMCONNSTR_ 除外,它沒有聲明的提供程序)。
環(huán)境變量鍵轉(zhuǎn)換的配置鍵提供程序配置條目
CUSTOMCONNSTR_<KEY>ConnectionStrings:<KEY>配置條目未創(chuàng)建。
MYSQLCONNSTR_<KEY>ConnectionStrings:<KEY>鍵:ConnectionStrings:<KEY>_ProviderName
值:MySql.Data.MySqlClient
SQLAZURECONNSTR_<KEY>ConnectionStrings:<KEY>鍵:ConnectionStrings:<KEY>_ProviderName
值:System.Data.SqlClient
SQLCONNSTR_<KEY>ConnectionStrings:<KEY>鍵:ConnectionStrings:<KEY>_ProviderName
值:System.Data.SqlClient

文件配置提供程序

FileConfigurationProvider 是從文件系統(tǒng)加載配置的基類。 以下配置提供程序?qū)S糜谔囟ㄎ募愋停?/p>

INI 配置提供程序

IniConfigurationProvider 在運行時從 INI 文件鍵值對加載配置。

若要激活 INI 文件配置,請在 ConfigurationBuilder 的實例上調(diào)用 AddIniFile 擴展方法。

冒號可用作 INI 文件配置中的節(jié)分隔符。

重載允許指定:

  • 文件是否可選。
  • 如果文件更改,是否重載配置。
  • IFileProvider 用于訪問該文件。

構建主機時調(diào)用 ConfigureAppConfiguration 以指定應用的配置:

C#

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.SetBasePath(Directory.GetCurrentDirectory());
                config.AddIniFile("config.ini", optional: true, reloadOnChange: true);
            })
            .UseStartup<Startup>();
}

基路徑使用 SetBasePath 設置。 SetBasePath 在 Microsoft.Extensions.Configuration.FileExtensions包中,后者在 Microsoft.AspNetCore.App 元包中。

直接創(chuàng)建 WebHostBuilder 時,請使用以下配置調(diào)用 UseConfiguration

C#

var config = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddIniFile("config.ini", optional: true, reloadOnChange: true)
    .Build();

var host = new WebHostBuilder()
    .UseConfiguration(config)
    .UseKestrel()
    .UseStartup<Startup>();

基路徑使用 SetBasePath 設置。 SetBasePath 在 Microsoft.Extensions.Configuration.FileExtensions包中,后者在 Microsoft.AspNetCore.App 元包中。

INI 配置文件的通用示例:

ini

[section0]
key0=value
key1=value

[section1]
subsection:key=value

[section2:subsection0]
key=value

[section2:subsection1]
key=value

以前的配置文件使用 value 加載以下鍵:

  • section0:key0
  • section0:key1
  • section1:subsection:key
  • section2:subsection0:key
  • section2:subsection1:key

JSON 配置提供程序

JsonConfigurationProvider 在運行時期間從 JSON 文件鍵值對加載配置。

若要激活 JSON 文件配置,請在 ConfigurationBuilder 的實例上調(diào)用 AddJsonFile 擴展方法。

重載允許指定:

  • 文件是否可選。
  • 如果文件更改,是否重載配置。
  • IFileProvider 用于訪問該文件。

使用 CreateDefaultBuilder 初始化新的 WebHostBuilder 時,會自動調(diào)用 AddJsonFile 兩次。 調(diào)用該方法來從以下文件加載配置:

  • appsettings.json – 首先讀取此文件。 該文件的環(huán)境版本可以替代 appsettings.json 文件提供的值。
  • appsettings.{Environment}.json– 根據(jù) IHostingEnvironment.EnvironmentName 加載文件的環(huán)境版本。

有關詳細信息,請參閱 Web 主機:設置主機

此外,CreateDefaultBuilder 也會加載:

首先建立 JSON 配置提供程序。 因此,用戶機密、環(huán)境變量和命令行參數(shù)會替代由 appsettings 文件設置的配置。

構建主機時調(diào)用 ConfigureAppConfiguration 以指定除 appsettings.json 和 appsettings.{Environment}.json 以外的文件的應用配置:

C#

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.SetBasePath(Directory.GetCurrentDirectory());
                config.AddJsonFile("config.json", optional: true, reloadOnChange: true);
            })
            .UseStartup<Startup>();
}

基路徑使用 SetBasePath 設置。 SetBasePath 在 Microsoft.Extensions.Configuration.FileExtensions包中,后者在 Microsoft.AspNetCore.App 元包中。

直接創(chuàng)建 WebHostBuilder 時,請使用以下配置調(diào)用 UseConfiguration

C#

var config = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("config.json", optional: true, reloadOnChange: true)
    .Build();

var host = new WebHostBuilder()
    .UseConfiguration(config)
    .UseKestrel()
    .UseStartup<Startup>();

基路徑使用 SetBasePath 設置。 SetBasePath 在 Microsoft.Extensions.Configuration.FileExtensions包中,后者在 Microsoft.AspNetCore.App 元包中。

示例

示例應用利用靜態(tài)便捷方法 CreateDefaultBuilder 來生成主機,其中包括兩個對 AddJsonFile 的調(diào)用。 配置從 appsettings.json 和 appsettings.{Environment}.json 進行加載。

  1. 運行示例應用。 在 http://localhost:5000 打開應用的瀏覽器。
  2. 觀察輸出是否包含表中所示的配置的鍵值對,具體取決于環(huán)境。 記錄配置鍵使用冒號 (:) 作為分層分隔符。
開發(fā)值生產(chǎn)值
Logging:LogLevel:System信息信息
Logging:LogLevel:Microsoft信息信息
Logging:LogLevel:Default調(diào)試Error
AllowedHosts**

XML 配置提供程序

XmlConfigurationProvider 在運行時從 XML 文件鍵值對加載配置。

若要激活 XML 文件配置,請在 ConfigurationBuilder 的實例上調(diào)用 AddXmlFile 擴展方法。

重載允許指定:

  • 文件是否可選。
  • 如果文件更改,是否重載配置。
  • IFileProvider 用于訪問該文件。

創(chuàng)建配置鍵值對時,將忽略配置文件的根節(jié)點。 不要在文件中指定文檔類型定義 (DTD) 或命名空間。

構建主機時調(diào)用 ConfigureAppConfiguration 以指定應用的配置:

C#

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.SetBasePath(Directory.GetCurrentDirectory());
                config.AddXmlFile("config.xml", optional: true, reloadOnChange: true);
            })
            .UseStartup<Startup>();
}

基路徑使用 SetBasePath 設置。 SetBasePath 在 Microsoft.Extensions.Configuration.FileExtensions包中,后者在 Microsoft.AspNetCore.App 元包中。

直接創(chuàng)建 WebHostBuilder 時,請使用以下配置調(diào)用 UseConfiguration

C#

var config = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddXmlFile("config.xml", optional: true, reloadOnChange: true)
    .Build();

var host = new WebHostBuilder()
    .UseConfiguration(config)
    .UseKestrel()
    .UseStartup<Startup>();

基路徑使用 SetBasePath 設置。 SetBasePath 在 Microsoft.Extensions.Configuration.FileExtensions包中,后者在 Microsoft.AspNetCore.App 元包中。

XML 配置文件可以為重復節(jié)使用不同的元素名稱:

XML

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <section0>
    <key0>value</key0>
    <key1>value</key1>
  </section0>
  <section1>
    <key0>value</key0>
    <key1>value</key1>
  </section1>
</configuration>

以前的配置文件使用 value 加載以下鍵:

  • section0:key0
  • section0:key1
  • section1:key0
  • section1:key1

如果使用 name 屬性來區(qū)分元素,則使用相同元素名稱的重復元素可以正常工作:

XML

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <section name="section0">
    <key name="key0">value</key>
    <key name="key1">value</key>
  </section>
  <section name="section1">
    <key name="key0">value</key>
    <key name="key1">value</key>
  </section>
</configuration>

以前的配置文件使用 value 加載以下鍵:

  • section:section0:key:key0
  • section:section0:key:key1
  • section:section1:key:key0
  • section:section1:key:key1

屬性可用于提供值:

XML

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <key attribute="value" />
  <section>
    <key attribute="value" />
  </section>
</configuration>

以前的配置文件使用 value 加載以下鍵:

  • key:attribute
  • section:key:attribute

Key-per-file 配置提供程序

KeyPerFileConfigurationProvider 使用目錄的文件作為配置鍵值對。 該鍵是文件名。 該值包含文件的內(nèi)容。 Key-per-file 配置提供程序用于 Docker 托管方案。

若要激活 Key-per-file 配置,請在 ConfigurationBuilder 的實例上調(diào)用 AddKeyPerFile 擴展方法。 文件的 directoryPath 必須是絕對路徑。

重載允許指定:

  • 配置源的 Action<KeyPerFileConfigurationSource> 委托。
  • 目錄是否可選以及目錄的路徑。

雙下劃線字符 (__) 用作文件名中的配置鍵分隔符。 例如,文件名 Logging__LogLevel__System 生成配置鍵 Logging:LogLevel:System。

構建主機時調(diào)用 ConfigureAppConfiguration 以指定應用的配置:

C#

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        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>();
}

基路徑使用 SetBasePath 設置。 SetBasePath 在 Microsoft.Extensions.Configuration.FileExtensions包中,后者在 Microsoft.AspNetCore.App 元包中。

直接創(chuàng)建 WebHostBuilder 時,請使用以下配置調(diào)用 UseConfiguration

C#

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>();

內(nèi)存配置提供程序

MemoryConfigurationProvider 使用內(nèi)存中集合作為配置鍵值對。

若要激活內(nèi)存中集合配置,請在 ConfigurationBuilder 的實例上調(diào)用 AddInMemoryCollection 擴展方法。

可以使用 IEnumerable<KeyValuePair<String,String>> 初始化配置提供程序。

構建主機時調(diào)用 ConfigureAppConfiguration 以指定應用的配置:

C#

public class Program
{
    public static readonly Dictionary<string, string> _dict = 
        new Dictionary<string, string>
        {
            {"MemoryCollectionKey1", "value1"},
            {"MemoryCollectionKey2", "value2"}
        };

    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddInMemoryCollection(_dict);
            })
            .UseStartup<Startup>();
}

直接創(chuàng)建 WebHostBuilder 時,請使用以下配置調(diào)用 UseConfiguration

C#

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>();

GetValue

ConfigurationBinder.GetValue<T> 從具有指定鍵的配置中提取一個值,并將其轉(zhuǎn)換為指定類型。 如果未找到該鍵,則過載允許你提供默認值。

如下示例中:

  • 使用鍵 NumberKey 從配置中提取字符串值。 如果在配置鍵中找不到 NumberKey,則使用默認值 99。
  • 鍵入值作為 int。
  • 存儲 NumberConfig 屬性中的值,以供頁面使用。

C#

// using Microsoft.Extensions.Configuration;

public class IndexModel : PageModel
{
    public IndexModel(IConfiguration config)
    {
        _config = config;
    }

    public int NumberConfig { get; private set; }

    public void OnGet()
    {
        NumberConfig = _config.GetValue<int>("NumberKey", 99);
    }
}

GetSection、GetChildren 和 Exists

對于下面的示例,請考慮以下 JSON 文件。 在兩個節(jié)中找到四個鍵,其中一個包含一對子節(jié):

JSON

{
  "section0": {
    "key0": "value",
    "key1": "value"
  },
  "section1": {
    "key0": "value",
    "key1": "value"
  },
  "section2": {
    "subsection0" : {
      "key0": "value",
      "key1": "value"
    },
    "subsection1" : {
      "key0": "value",
      "key1": "value"
    }
  }
}

將文件讀入配置時,會創(chuàng)建以下唯一的分層鍵來保存配置值:

  • section0:key0
  • section0:key1
  • section1:key0
  • section1:key1
  • section2:subsection0:key0
  • section2:subsection0:key1
  • section2:subsection1:key0
  • section2:subsection1:key1

GetSection

IConfiguration.GetSection 使用指定的子節(jié)鍵提取配置子節(jié)。 GetSection 在 Microsoft.Extensions.Configuration 包中,后者在 Microsoft.AspNetCore.App 元包中。

若要返回僅包含 section1 中鍵值對的 IConfigurationSection,請調(diào)用 GetSection 并提供節(jié)名稱:

C#

var configSection = _config.GetSection("section1");

configSection 不具有值,只有密鑰和路徑。

同樣,若要獲取 section2:subsection0 中鍵的值,請調(diào)用 GetSection 并提供節(jié)路徑:

C#

var configSection = _config.GetSection("section2:subsection0");

GetSection 永遠不會返回 null。 如果找不到匹配的節(jié),則返回空 IConfigurationSection。

當 GetSection 返回匹配的部分時,Value 未填充。 存在該部分時,返回一個 Key 和 Path 部分。

GetChildren

在 section2 上調(diào)用 IConfiguration.GetChildren 會獲得 IEnumerable<IConfigurationSection>,其中包括:

  • subsection0
  • subsection1

C#

var configSection = _config.GetSection("section2");

var children = configSection.GetChildren();

存在

使用 ConfigurationExtensions.Exists 確定配置節(jié)是否存在:

C#

var sectionExists = _config.GetSection("section2:subsection2").Exists();

給定示例數(shù)據(jù),sectionExists 為 false,因為配置數(shù)據(jù)中沒有 section2:subsection2 節(jié)。

綁定至類

可以使用選項模式將配置綁定到表示相關設置組的類。 有關更多信息,請參見ASP.NET Core 中的選項模式。

配置值作為字符串返回,但調(diào)用 Bind 可以構造 POCO 對象。 Bind 在 Microsoft.Extensions.Configuration.Binder 包中,后者在 Microsoft.AspNetCore.App 元包中。

示例應用包含 Starship 模型 (Models/Starship.cs):

C#

public class Starship
{
    public string Name { get; set; }
    public string Registry { get; set; }
    public string Class { get; set; }
    public decimal Length { get; set; }
    public bool Commissioned { get; set; }
}

當示例應用使用 JSON 配置提供程序加載配置時,starship.json 文件的 starship 節(jié)會創(chuàng)建配置:

JSON

{
  "starship": {
    "name": "USS Enterprise",
    "registry": "NCC-1701",
    "class": "Constitution",
    "length": 304.8,
    "commissioned": false
  },
  "trademark": "Paramount Pictures Corp. http://www.paramount.com"
}

創(chuàng)建以下配置鍵值對:

starship:nameUSS Enterprise
starship:registryNCC-1701
starship:classConstitution
starship:length304.8
starship:commissionedFalse
trademarkParamount Pictures Corp. http://www.paramount.com

示例應用使用 starship 鍵調(diào)用 GetSection。 starship 鍵值對是獨立的。 在子節(jié)傳入 Starship類的實例時調(diào)用 Bind 方法。 綁定實例值后,將實例分配給用于呈現(xiàn)的屬性:

C#

var starship = new Starship();
_config.GetSection("starship").Bind(starship);
Starship = starship;

GetSection 在 Microsoft.Extensions.Configuration 包中,后者在 Microsoft.AspNetCore.App 元包中。

綁定至對象圖

Bind 能夠綁定整個 POCO 對象圖。 Bind 在 Microsoft.Extensions.Configuration.Binder 包中,后者在 Microsoft.AspNetCore.App 元包中。

該示例包含 TvShow 模型,其對象圖包含 Metadata 和 Actors 類 (Models/TvShow.cs):

C#

public class TvShow
{
    public Metadata Metadata { get; set; }
    public Actors Actors { get; set; }
    public string Legal { get; set; }
}

public class Metadata
{
    public string Series { get; set; }
    public string Title { get; set; }
    public DateTime AirDate { get; set; }
    public int Episodes { get; set; }
}

public class Actors
{
    public string Names { get; set; }
}

示例應用有一個包含配置數(shù)據(jù)的 tvshow.xml 文件:

XML

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <tvshow>
    <metadata>
      <series>Dr. Who</series>
      <title>The Sun Makers</title>
      <airdate>11/26/1977</airdate>
      <episodes>4</episodes>
    </metadata>
    <actors>
      <names>Tom Baker, Louise Jameson, John Leeson</names>
    </actors>
    <legal>(c)1977 BBC https://www.bbc.co.uk/programmes/b006q2x0</legal>
  </tvshow>
</configuration>

使用 Bind 方法將配置綁定到整個 TvShow 對象圖。 將綁定實例分配給用于呈現(xiàn)的屬性:

C#

var tvShow = new TvShow();
_config.GetSection("tvshow").Bind(tvShow);
TvShow = tvShow;

ConfigurationBinder.Get<T> 綁定并返回指定類型。 Get<T> 比使用 Bind 更方便。 以下代碼顯示如何將 Get<T> 與前面的示例一起使用,該示例允許將綁定實例直接分配給用于呈現(xiàn)的屬性:

C#

TvShow = _config.GetSection("tvshow").Get<TvShow>();

Get 在 Microsoft.Extensions.Configuration.Binder 包中,后者在 Microsoft.AspNetCore.App 元包中。ASP.NET Core 1.1 或更高版本中提供了 Get<T>。 GetSection 在 Microsoft.Extensions.Configuration 包中,后者在 Microsoft.AspNetCore.App 元包中。

將數(shù)組綁定至類

示例應用演示了本部分中介紹的概念。

Bind 支持使用配置鍵中的數(shù)組索引將數(shù)組綁定到對象。 公開數(shù)字鍵段(:0:、:1:、… :{n}:)的任何數(shù)組格式都能夠與 POCO 類數(shù)組進行數(shù)組綁定。 `Bind`` 在 Microsoft.Extensions.Configuration.Binder 包中,后者在 Microsoft.AspNetCore.App 元包中。

 備注

綁定是按約定提供的。 不需要自定義配置提供程序?qū)崿F(xiàn)數(shù)組綁定。

內(nèi)存中數(shù)組處理

請考慮下表中所示的配置鍵和值。

array:entries:0value0
array:entries:1value1
array:entries:2value2
array:entries:4value4
array:entries:5value5

使用內(nèi)存配置提供程序在示例應用中加載這些鍵和值:

C#

public class Program
{
    public static Dictionary<string, string> arrayDict = new Dictionary<string, string>
        {
            {"array:entries:0", "value0"},
            {"array:entries:1", "value1"},
            {"array:entries:2", "value2"},
            {"array:entries:4", "value4"},
            {"array:entries:5", "value5"}
        };

    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.SetBasePath(Directory.GetCurrentDirectory());
                config.AddInMemoryCollection(arrayDict);
                config.AddJsonFile("json_array.json", optional: false, reloadOnChange: false);
                config.AddJsonFile("starship.json", optional: false, reloadOnChange: false);
                config.AddXmlFile("tvshow.xml", optional: false, reloadOnChange: false);
                config.AddEFConfiguration(options => options.UseInMemoryDatabase("InMemoryDb"));
                config.AddCommandLine(args);
            })
            .UseStartup<Startup>();
}

該數(shù)組跳過索引 #3 的值。 配置綁定程序無法綁定 null 值,也無法在綁定對象中創(chuàng)建 null 條目,這在演示將此數(shù)組綁定到對象的結果時變得清晰。

在示例應用中,POCO 類可用于保存綁定的配置數(shù)據(jù):

C#

public class ArrayExample
{
    public string[] Entries { get; set; }
}

將配置數(shù)據(jù)綁定至對象:

C#

var arrayExample = new ArrayExample();
_config.GetSection("array").Bind(arrayExample);

GetSection 在 Microsoft.Extensions.Configuration 包中,后者在 Microsoft.AspNetCore.App 元包中。

還可以使用 ConfigurationBinder.Get<T> 語法,從而產(chǎn)生更精簡的代碼:

C#

ArrayExample = _config.GetSection("array").Get<ArrayExample>();

綁定對象(ArrayExample 的實例)從配置接收數(shù)組數(shù)據(jù)。

ArrayExample.Entries 索引ArrayExample.Entries 值
0value0
1value1
2value2
3value4
4value5

綁定對象中的索引 #3 保留 array:4 配置鍵的配置數(shù)據(jù)及其值 value4。 當綁定包含數(shù)組的配置數(shù)據(jù)時,配置鍵中的數(shù)組索引僅用于在創(chuàng)建對象時迭代配置數(shù)據(jù)。 無法在配置數(shù)據(jù)中保留 null 值,并且當配置鍵中的數(shù)組跳過一個或多個索引時,不會在綁定對象中創(chuàng)建 null 值條目。

可以在由任何在配置中生成正確鍵值對的配置提供程序綁定到 ArrayExample 實例之前提供索引 #3 的缺失配置項。 如果示例包含具有缺失鍵值對的其他 JSON 配置提供程序,則 ArrayExample.Entries 與完整配置數(shù)組相匹配:

missing_value.json:

JSON

{
  "array:entries:3": "value3"
}

在 ConfigureAppConfiguration中:

C#

config.AddJsonFile("missing_value.json", optional: false, reloadOnChange: false);

將表中所示的鍵值對加載到配置中。

array:entries:3value3

如果在 JSON 配置提供程序包含索引 #3 的條目之后綁定 ArrayExample 類實例,則 ArrayExample.Entries 數(shù)組包含該值。

ArrayExample.Entries 索引ArrayExample.Entries 值
0value0
1value1
2value2
3value3
4value4
5value5

JSON 數(shù)組處理

如果 JSON 文件包含數(shù)組,則會為具有從零開始的節(jié)索引的數(shù)組元素創(chuàng)建配置鍵。 在以下配置文件中,subsection 是一個數(shù)組:

JSON

{
  "json_array": {
    "key": "valueA",
    "subsection": [
      "valueB",
      "valueC",
      "valueD"
    ]
  }
}

JSON 配置提供程序?qū)⑴渲脭?shù)據(jù)讀入以下鍵值對:

json_array:keyvalueA
json_array:subsection:0valueB
json_array:subsection:1valueC
json_array:subsection:2valueD

在示例應用中,以下 POCO 類可用于綁定配置鍵值對:

C#

public class JsonArrayExample
{
    public string Key { get; set; }
    public string[] Subsection { get; set; }
}

綁定后,JsonArrayExample.Key 保存值 valueA。 子節(jié)值存儲在 POCO 數(shù)組屬性 Subsection 中。

JsonArrayExample.Subsection 索引JsonArrayExample.Subsection 值
0valueB
1valueC
2valueD

自定義配置提供程序

該示例應用演示了如何使用實體框架 (EF) 創(chuàng)建從數(shù)據(jù)庫讀取配置鍵值對的基本配置提供程序。

提供程序具有以下特征:

  • EF 內(nèi)存中數(shù)據(jù)庫用于演示目的。 若要使用需要連接字符串的數(shù)據(jù)庫,請實現(xiàn)輔助 ConfigurationBuilder 以從另一個配置提供程序提供連接字符串。
  • 提供程序在啟動時將數(shù)據(jù)庫表讀入配置。 提供程序不會基于每個鍵查詢數(shù)據(jù)庫。
  • 未實現(xiàn)更改時重載,因此在應用啟動后更新數(shù)據(jù)庫對應用的配置沒有任何影響。

定義用于在數(shù)據(jù)庫中存儲配置值的 EFConfigurationValue 實體。

Models/EFConfigurationValue.cs:

C#

public class EFConfigurationValue
{
    public string Id { get; set; }
    public string Value { get; set; }
}

添加 EFConfigurationContext 以存儲和訪問配置的值。

EFConfigurationProvider/EFConfigurationContext.cs:

C#

public class EFConfigurationContext : DbContext
{
    public EFConfigurationContext(DbContextOptions options) : base(options)
    {
    }

    public DbSet<EFConfigurationValue> Values { get; set; }
}

創(chuàng)建用于實現(xiàn) IConfigurationSource 的類。

EFConfigurationProvider/EFConfigurationSource.cs:

C#

public class EFConfigurationSource : IConfigurationSource
{
    private readonly Action<DbContextOptionsBuilder> _optionsAction;

    public EFConfigurationSource(Action<DbContextOptionsBuilder> optionsAction)
    {
        _optionsAction = optionsAction;
    }

    public IConfigurationProvider Build(IConfigurationBuilder builder)
    {
        return new EFConfigurationProvider(_optionsAction);
    }
}

通過從 ConfigurationProvider 繼承來創(chuàng)建自定義配置提供程序。 當數(shù)據(jù)庫為空時,配置提供程序?qū)ζ溥M行初始化。

EFConfigurationProvider/EFConfigurationProvider.cs:

C#

public class EFConfigurationProvider : ConfigurationProvider
{
    public EFConfigurationProvider(Action<DbContextOptionsBuilder> optionsAction)
    {
        OptionsAction = optionsAction;
    }

    Action<DbContextOptionsBuilder> OptionsAction { get; }

    // Load config data from EF DB.
    public override void Load()
    {
        var builder = new DbContextOptionsBuilder<EFConfigurationContext>();

        OptionsAction(builder);

        using (var dbContext = new EFConfigurationContext(builder.Options))
        {
            dbContext.Database.EnsureCreated();

            Data = !dbContext.Values.Any()
                ? CreateAndSaveDefaultValues(dbContext)
                : dbContext.Values.ToDictionary(c => c.Id, c => c.Value);
        }
    }

    private static IDictionary<string, string> CreateAndSaveDefaultValues(
        EFConfigurationContext dbContext)
    {
        // Quotes (c)2005 Universal Pictures: Serenity
        // https://www.uphe.com/movies/serenity
        var configValues = new Dictionary<string, string>
            {
                { "quote1", "I aim to misbehave." },
                { "quote2", "I swallowed a bug." },
                { "quote3", "You can't stop the signal, Mal." }
            };

        dbContext.Values.AddRange(configValues
            .Select(kvp => new EFConfigurationValue 
                {
                    Id = kvp.Key,
                    Value = kvp.Value
                })
            .ToArray());

        dbContext.SaveChanges();

        return configValues;
    }
}

可以使用 AddEFConfiguration 擴展方法將配置源添加到 ConfigurationBuilder。

Extensions/EntityFrameworkExtensions.cs:

C#

public static class EntityFrameworkExtensions
{
    public static IConfigurationBuilder AddEFConfiguration(
        this IConfigurationBuilder builder, 
        Action<DbContextOptionsBuilder> optionsAction)
    {
        return builder.Add(new EFConfigurationSource(optionsAction));
    }
}

下面的代碼演示如何在 Program.cs 中使用自定義的 EFConfigurationProvider:

C#

public class Program
{
    public static Dictionary<string, string> arrayDict = new Dictionary<string, string>
        {
            {"array:entries:0", "value0"},
            {"array:entries:1", "value1"},
            {"array:entries:2", "value2"},
            {"array:entries:4", "value4"},
            {"array:entries:5", "value5"}
        };

    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.SetBasePath(Directory.GetCurrentDirectory());
                config.AddInMemoryCollection(arrayDict);
                config.AddJsonFile("json_array.json", optional: false, reloadOnChange: false);
                config.AddJsonFile("starship.json", optional: false, reloadOnChange: false);
                config.AddXmlFile("tvshow.xml", optional: false, reloadOnChange: false);
                config.AddEFConfiguration(options => options.UseInMemoryDatabase("InMemoryDb"));
                config.AddCommandLine(args);
            })
            .UseStartup<Startup>();
}

在啟動期間訪問配置

將 IConfiguration 注入 Startup 構造函數(shù)以訪問 Startup.ConfigureServices 中的配置值。 若要訪問 Startup.Configure 中的配置,請將 IConfiguration 直接注入方法或使用構造函數(shù)中的實例:

C#

public class Startup
{
    private readonly IConfiguration _config;

    public Startup(IConfiguration config)
    {
        _config = config;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        var value = _config["key"];
    }

    public void Configure(IApplicationBuilder app, IConfiguration config)
    {
        var value = config["key"];
    }
}

有關使用啟動便捷方法訪問配置的示例,請參閱應用啟動:便捷方法。

在 Razor Pages 頁或 MVC 視圖中訪問配置

若要訪問 Razor Pages 頁或 MVC 視圖中的配置設置,請為 Microsoft.Extensions.Configuration 命名空間添加 using 指令C# 參考:using 指令)并將 IConfiguration 注入頁面或視圖。

在 Razor 頁面頁中:

CSHTML

@page
@model IndexModel
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Index Page</title>
</head>
<body>
    <h1>Access configuration in a Razor Pages page</h1>
    <p>Configuration value for 'key': @Configuration["key"]</p>
</body>
</html>

在 MVC 視圖中:

CSHTML

@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Index View</title>
</head>
<body>
    <h1>Access configuration in an MVC view</h1>
    <p>Configuration value for 'key': @Configuration["key"]</p>
</body>
</html>

從外部程序集添加配置

通過 IHostingStartup 實現(xiàn),可在啟動時從應用 Startup 類之外的外部程序集向應用添加增強功能。有關更多信息,請參見在 ASP.NET Core 中使用承載啟動程序集。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號