接續前一篇的程式改良。

ASP.NET Core 已不是用 web.config,但仍有 appSetting,網站可調參數是放在 appSettings.json,專案範本預設內容如下:

appSettings.json 裡的設定值可透過 IConfiguration 讀取,依據 ASP.NET Core 標準做法,應使用 DI 機制從建構式取得 IConfiguration 並保存供後續使用。專案範本有個現成例子是 Startup.cs,建構式就有接收 IConfiguration 存入 Configuration 屬性:

要讀取 appsettings.json 設定,寫 GetValue<T>(完整路徑) 即可以了。若參數有多層結構(例如:Logging 下的 LogLevel 下的 Default),則用冒號分隔,例如::

var allowHosts = 
    configuration.GetValue<string>("AllowedHosts");
var defaulLogLevel = 
    configuration.GetValue<string>("Logging:LogLevel:Default");

實測結果如下:

回到我的案例,把 URL 寫死在程式碼很不專業,應該搬到 appsettings.json。所以在 appsettings.json 加個 CwbApiUrl 設定如下:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "CwbApiUrl": "https://opendata.cwb.gov.tw/fileapi/v1/opendataapi/F-C0032-001?Authorization=...API Key...&downloadType=WEB&format=JSON"
}

SimpleWeatherService 則稍做修改,在建構式接收 Microsoft.Extensions.Configuration.IConfiguration configuration。SimpleWeatherService 在 Startup.cs ConfigureServices(IServiceCollection services) services.AddTransient<IWeatherService, SimpleWeatherService>() 被註冊到 DI 容器,ASP.NET Core DI 機構在建立 Instance 時將會傳入 IConfiguration,用 configuration.GetValue<string>("CwbApiUrl") 即可取得設定:

public class SimpleWeatherService : IWeatherService
{
    readonly string openDataApiUrl;

    public SimpleWeatherService(
        Microsoft.Extensions.Configuration.IConfiguration configuration)
    {
        openDataApiUrl = configuration.GetValue<string>("CwbApiUrl");
    }

    //...其餘部分不變...

與 web.config 時代的做法有點差距,並也不難上手就是了。

以上便是 ASP.NET Core appSetings.json 的基本用法,下一篇我們再來聊聊非同步化。

Example of how to use appSetting in ASP.NET Core.


Comments

# by Kz

關於針對不同組態要對應不同的設定檔,似乎不像原本切換組態後再編譯就完成。我在 console 中的實作就變成要透過傳遞 args 來決定是在執行哪個環境。大大有沒有比較理想的做法呢 ??

# by 卡比

我在 linux 起了一個 service 運行 dotnet core 的 app,environment 的值放在 service 的內容裡

Post a comment