乘風破浪,遇見最佳跨平臺跨終端框架.Net Core/.Net生態 - 淺析ASP.NET Core配置框架,讓服務無縫適應各種環境

ASP.NET Core配置框架

image

ASP.NET Core配置框架的核心組件包是如下兩個:

  • Microsoft.Extensions.Configuration.Abstractions,配置框架抽象定義
  • Microsoft.Extensions.Configuration,配置框架默認實現。

image

獲取安裝配置框架包

https://www.nuget.org/packages/Microsoft.Extensions.Configuration.Abstractions

dotnet add package Microsoft.Extensions.Configuration.Abstractions

image

https://www.nuget.org/packages/Microsoft.Extensions.Configuration

dotnet add package Microsoft.Extensions.Configuration

image

框架特點

  • 以Key-Value字符串的鍵值對方式抽象了配置。
  • 支持從各種不同的數據源讀取配置。

核心類型

  • IConfiguration
  • IConfigurationRoot
  • IConfigurationSection
  • IConfigurationBuilder

框架擴展點

  • IConfigurationSource
  • IConfigurationProvider

實踐理解

https://github.com/TaylorShi/HelloConfiguration

創建項目安裝Nuget包

image

image

使用內存數據源(AddInMemoryCollection)

依賴包

dotnet add package Microsoft.Extensions.Configuration
dotnet add package Microsoft.Extensions.Configuration.Abstractions

雖然配置是以Key-Value來組裝配置,但是也可以通過分隔符:來分組。

// 創建配置構建器
IConfigurationBuilder builder = new ConfigurationBuilder();
// 添加內存數據源
builder.AddInMemoryCollection(new Dictionary<string, string>
{
    { "car1", "tesla"},
    { "car2", "benci"},
    { "group:car3", "byd"}
});
// 構建配置獲取配置根
IConfigurationRoot configurationRoot = builder.Build();
// 獲取並輸出配置根下的值
Console.WriteLine(configurationRoot["car1"]);
Console.WriteLine(configurationRoot["car2"]);
// 獲取並輸出配置節點下的值
IConfigurationSection configurationSection = configurationRoot.GetSection("group");
Console.WriteLine($"car3:{configurationSection["car3"]}");
Console.WriteLine($"car4:{configurationSection["car4"]}");

運行效果:

tesla
benci
car3:byd
car4:

使用命令行數據源(AddCommandLine)

依賴包

dotnet add package Microsoft.Extensions.Configuration
dotnet add package Microsoft.Extensions.Configuration.Abstractions
dotnet add package Microsoft.Extensions.Configuration.CommandLine

支持命令格式包括:

  • 無前綴的Key=Value模式。
  • 雙中橫線模式 --key=value 或 --key value
  • 正斜杆模式 /key=value 或 /key value

注意,等號分隔符和空格分隔符不能混用。

命令替換模式

  • 必須以單橫杆(-)或雙橫杆(--)開頭
  • 映射字典不能包含重複Key

配置調試啓動命令行參數

CommandLineKey1=Value1 --CommandLineKey2=value2 /CommandLineKey3=value3 -k1=k3

image

launchSettings.json

{
  "profiles": {
    "demoForConsole31": {
      "commandName": "Project",
      "commandLineArgs": "CommandLineKey1=Value1 --CommandLineKey2=value2 /CommandLineKey3=value3 -k1=k3"
    }
  }
}

示例代碼

// 創建配置構建器
IConfigurationBuilder builder = new ConfigurationBuilder();
var mapper = new Dictionary<string, string> { { "-k1", "CommandLineKey1" } };
// 添加命令行數據源
builder.AddCommandLine(args, mapper);
// 構建配置獲取配置根
IConfigurationRoot configurationRoot = builder.Build();
// 獲取並輸出配置根下的值
Console.WriteLine(configurationRoot["CommandLineKey1"]);
Console.WriteLine(configurationRoot["CommandLineKey2"]);
Console.WriteLine(configurationRoot["CommandLineKey3"]);

因爲這裏-k1單橫杆模式代表別名,這裏我們設計了一個Mapper,指定了這個-k1就是指代了CommandLineKey1

運行結果:

k3
value2
value3

雖然CommandLineKey1最初的值是value1,但是後面它又被-k1這個別名替代了,所以它的值最終是-k帶進來的值,也就是k3

Dotnet Cli官方的示例

image

這裏的-h就代表了--help

使用環境變量數據源(AddEnvironmentVariables)

依賴包

dotnet add package Microsoft.Extensions.Configuration
dotnet add package Microsoft.Extensions.Configuration.Abstractions
dotnet add package Microsoft.Extensions.Configuration.EnvironmentVariables

適用場景

  • 在Docker中運行中。
  • 在Kubernetes中運行時。
  • 需要設置ASP.NET Core的一些內置特殊配置時。

特性

  • 對於配置的分層鍵,支持用雙下橫線__替代:
  • 支持根據前綴加載

配置調試啓動環境變量

image

launchSettings.json

{
  "profiles": {
    "demoForConsole31": {
      "commandName": "Project",
      "environmentVariables": {
        "car1": "tesla",
        "car2": "byd",
        "car__car3": "benci"
      }
    }
  }
}

示例代碼

// 創建配置構建器
IConfigurationBuilder builder = new ConfigurationBuilder();
// 添加環境變量數據源
builder.AddEnvironmentVariables();
// 構建配置獲取配置根
IConfigurationRoot configurationRoot = builder.Build();
// 獲取並輸出配置根下的值
Console.WriteLine(configurationRoot["car1"]);
Console.WriteLine(configurationRoot["car2"]);
// 單級分層
Console.WriteLine(configurationRoot.GetSection("car")["car3"]);
// 多級分層
Console.WriteLine(configurationRoot.GetSection("car4:car5")["car6"]);

運行結果:

tesla
byd
benci
baoma

這裏car通過分隔符__來分層了。

前綴過濾

// 創建配置構建器
IConfigurationBuilder builder = new ConfigurationBuilder();
// 添加環境變量數據源並且過濾前綴
builder.AddEnvironmentVariables("car_");
// 構建配置獲取配置根
IConfigurationRoot configurationRoot = builder.Build();
// 獲取並輸出配置根下的值
Console.WriteLine(configurationRoot["car_xxx"]);
{
    "environmentVariables": {
        "car1": "tesla",
        "car2": "byd",
        "car__car3": "benci",
        "car4__car5__car6": "baoma",
        "car_xxx": "jieguan"
    }
}

運行結果:

理論上應該是

jieguan

但運行不顯示,還不知道爲何?

文件配置

提供程序

  • Microsoft.Extensions.Configuration.Ini
  • Microsoft.Extensions.Configuration.Json
  • Microsoft.Extensions.Configuration.Xml
  • Microsoft.Extensions.Configuration.UserSecrets
  • Microsoft.Extensions.Configuration.NewtonsoftJson(已廢棄)

特性

  • 指定文件可選、必選
  • 指定是否監視文件的變更

使用Json文件配置(AddJsonFile)

依賴包

dotnet add package Microsoft.Extensions.Configuration.Json

添加Json配置文件(appsettings.json)

{
  "car1": "tesla",
  "car2": "byd",
  "car3": "baoma",
  "car4": 10
}

示例代碼

// 創建配置構建器
IConfigurationBuilder builder = new ConfigurationBuilder();
// 添加Json文件數據源
builder.AddJsonFile("appsettings.json");
// 構建配置獲取配置根
IConfigurationRoot configurationRoot = builder.Build();
// 獲取並輸出配置根下的值
Console.WriteLine(configurationRoot["car1"]);
Console.WriteLine(configurationRoot["car2"]);
Console.WriteLine(configurationRoot["car3"]);
Console.WriteLine(configurationRoot["car4"]);

運行結果

tesla
byd
baoma
10

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章