iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 12
1
Modern Web

.Net Core 網站開發 101系列 第 12

Configuration 組態設定 - 1/2

  • 分享至 

  • xImage
  •  

ASP.NET Core 所使用的應用程式設定是由 ConfigurationProvider 所建立的 key-value 資料結構。ConfigurationProvider 會讀取不同的設定來源並轉成 key-value 資料結構。設定來源可能是:

  • Azure Key Vault
  • 命令列參數
  • 自己定義的 Provider
  • 目錄檔案
  • 環境變數
  • .NET 物件實例 (Dictionary)
  • 設定檔

有些設定來源可能會是階層式的資料,ConfigurationProvider 會用分隔符號把階層式資料攤平成 key-value 的結構,例如下面的 JSON 檔案:

{
  "profile": {
    "name": "Rex",  
    "creations": {
        "blogs": [{
            "title": ".NET Core 介紹",
        }, {
            "title": "常用 dotnet 命令介紹"
        }],
        "projects": [{
            "name": "ironman2018",
        }]
    }  
  },
}

當這個檔案被讀進來時,會建立對應攤平後的 key 值來維護原本的階層式結構。框架中是使用 : (冒號)來組合攤平後的 key 值。所以上面的 JSON 檔案在應用程式中會變成下列 key 值:

  • profile:name
  • profile:creations:blogs:0:title
  • profile:creations:blogs:1:title
  • profile:creations:projects:0:name

當設定被建立後,應用程式中可以透過注入 IConfiguration 來使用這些設定值。

設定來源

應用程式會在 Main 方法中呼叫 CreateWebHost 時指定設定來源。在 ASP.NET Core 2.0 之前,要使用 ConfigurationBuilder 類別來建立應用程式設定;ASP.NET Core 2.1 開始則提供 ConfigureAppConfiguration 擴充方法來做設定。

public class Program
{
    private static Dictionary<string, string> _inMemoryConfig = new Dictionary<string, string>
    {
        {"profile:name", "Rex"},
        {"profile:creations:blogs:0:title", ".NET Core 介紹"},
        {"profile:creations:blogs:1:title", "常用 dotnet 命令介紹"},
        {"profile:creations:projects:0:name", "ironman2018"}
    };

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

    public static IWebHostBuilder CreateWebHostBuilder(string[] args)
    {
        var startupAssemblyName = typeof(Startup).GetTypeInfo().Assembly.FullName;

        // ASP.NET Core 2.0 or earlier
        //            var configuration = new ConfigurationBuilder()
        //                .SetBasePath(Directory.GetCurrentDirectory())
        //                .AddInMemoryCollection(_inMemoryConfig)
        //                .AddJsonFile("appsettings.json")
        //                .AddCommandLine(args)
        //                .Build();
        //
        //            return WebHost.CreateDefaultBuilder(args)
        //                .UseConfiguration(configuration)
        //                .UseStartup(startupAssemblyName);

        return WebHost.CreateDefaultBuilder(args)
            // ASP.NET Core 2.1 or later
            .ConfigureAppConfiguration((hostContext, configBuilder) =>
            {
                configBuilder
                    .SetBasePath(Directory.GetCurrentDirectory())
                    .AddInMemoryCollection(_inMemoryConfig)
                    .AddJsonFile("appsettings.json")
                    .AddCommandLine(args);
            })
            .UseStartup(startupAssemblyName);
    }
}

指定設定來源時可以依序加入不同來源,如果不同來源有相同的 key 值,會使用最後加入的來源。

取得設定值

IConfiguration 提供幾個擴充方法來取得應用程式設定的值或集合片段。

GetValue<T>

這個方法接收兩個參數。第一個參數為要取得的設定 key 值;第二個參數可依需要傳入,代表找不到 key 值時的預設值。

下列範例會從設定中取得 profile:name 對應的設定值,同時轉換成 string 型態。如果找不到,會傳回 Not Rex?

var authorName = _config.GetValue<string>("profile:name", "Not Rex?");

GetSection

根據第一個參數傳入的 key 值,傳回對應的設定片段,回傳 IConfigurationSection

var profileSection = _config.GetSection("profile");

GetChildren

取得特定片段的子片段,回傳 IEnumerable<IConfigurationSection>

Exists

用來判斷特定的 key 值是否存在設定中。

參考資料


上一篇
Environments 多重環境
下一篇
Configuration 組態設定 - 2/2
系列文
.Net Core 網站開發 10131
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言