在 .NET Core 主控台應用程式中使用 appsettings.json 設定檔

栏目: ASP.NET · 发布时间: 7年前

内容简介:如果建立過 ASP.NET Core 的專案範本,會在專案資料夾中看到首先,使用 Visual Studio 預設的主控台應用程式(.NET Core)專案範本來建立一個空白的專案。

如果建立過 ASP.NET Core 的專案範本,會在專案資料夾中看到 appsettings.json 這個 ASP.NET Core 應用程式的組態設定檔,透過這個檔案我們可以把應用程式的設定從程式碼中抽離,以達到跨環境,或是管理組態檔的目的。如果要在主控台應用程式中使用這樣的手法來控制組態設定,或是要透過環境變數來指定你要使用的組態檔,你可以參考這篇的作法。

建立專案

首先,使用 Visual Studio 預設的主控台應用程式(.NET Core)專案範本來建立一個空白的專案。

在 .NET Core 主控台應用程式中使用 appsettings.json 設定檔

預設的專案樣貌很簡單,只有一個 Program.cs 檔案。

在 .NET Core 主控台應用程式中使用 appsettings.json 設定檔

安裝套件

組態設定可以來自多種來源,可能是來自一個 JSON 檔或者是來自環境變數,以下為常見的來源:

  • 檔案格式,例如 INI、JSON 或者 XML 檔
  • 透過啟動應用程式時,給的命令列參數
  • 執行環境的環境變數

這裡我們會使用微軟提供的 ConfigurationBuilder 來幫助我們整合多來源的組態設定,主要會使用到以下 3 個套件,用途說明如下:

Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.Json
Microsoft.Extensions.Configuration.EnvironmentVariables

除了上面 3 個套件外,建議多安裝下面這個:

  • Microsoft.Extensions.Configuration.Binder 提供綁定資料與物件的擴充方法,搭配 POCO 讓組態設定更容易被使用(祥參考下面的範例)

讀取組態

加入 appsetting.json 組態設定檔至主控台應用程式專案資料夾中,設定檔內容如下:

{
    "Message":  "It's appsettings.json" 
}

為了讓我們之後方便取用組態設定檔中的設定值,比照設定檔內容建立一個 POCO 模型 AppSettingsModel.cs

public class AppSettingsModel
{
    public string Message { get; set; }
}

接著建立一個透過 ConfigurationBuilder 取得組態設定的方法,請參考下列程式碼:

public static IConfigurationRoot ReadFromAppSettings()
{
    return new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", false)
        .Build();
}

動作很簡單,就是靠 ConfigurationBuilder 將應用程式執行目錄下的 appsettings.json 檔案來源載入,最後透過 Build() 產生一個組態物件做回傳。

這裡如果你想要增加並整合不同的來源組態時,例如依照環境變數載入 Debug 的組態檔,或者載入來自環境變數的組態設定,請參考下列程式碼:

public static IConfigurationRoot ReadFromAppSettings()
{
    return new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", false)
        .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("NETCORE_ENVIRONMENT")}.json", optional: true)
        .AddEnvironmentVariables()
        .Build();
}

第二個 AddJsonFile() 會透過藉由 NETCORE_ENVIRONMENT 這個環境變數來指定要加載的組態檔,使用這個方法時,通常會加上 optional 這個參數, true 代表這個加載項是非必要的,沒有這個檔案也沒關係。

AddEnvironmentVariables() 則是會載入來自環境變數的組態設定。

NETCORE_ENVIRONMENT 是自訂的環境變數名稱,是參考至 ASP.NET Core 會使用 ASPNETCORE_ENVIRONMENT 環境變數,作為區分來源組態的設定。

順便提一下。

在開發時間,多少都會用 Visual Studio 的偵錯功能來測試開發中的應用程式,這時我們可以在專案屬性設定的偵錯 (Debug) 頁籤中設定偵錯時期的環境變數 (如下圖),或者你也可以直接修改 Properties 資料夾下的 launchSettings.json ,自己指定對應環境變數的值。

在 .NET Core 主控台應用程式中使用 appsettings.json 設定檔

建置 & 執行

到這裡我們就可以透過切換環境變數,來指定應用程式要使用哪一個組態檔了,執行結果如下圖。

在 .NET Core 主控台應用程式中使用 appsettings.json 設定檔

其他細節

到這裡我們想要達成的目標都處理好了,以下是一些其他細節的補充。

調整專案的檔案結構

我們期待的專案的檔案結構會像是下圖右邊, appsettings.json 會有檔案階層,這樣看起來比較順眼。

在 .NET Core 主控台應用程式中使用 appsettings.json 設定檔

要做到檔案階層的收折,要來調整 .csproj 專案檔,請參考下列程式碼:

<Project Sdk="Microsoft.NET.Sdk">
    <!-- 略... -->
    <ItemGroup>
        <None Update="appsettings.json">
            <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        </None>
        <None Update="appsettings.Debug.json">
            <CopyToOutputDirectory>Always</CopyToOutputDirectory>
            <DependentUpon>appsettings.json</DependentUpon>
        </None>
        <None Update="appsettings.Release.json">
            <CopyToOutputDirectory>Always</CopyToOutputDirectory>
            <DependentUpon>appsettings.json</DependentUpon>
        </None>
    </ItemGroup>
</Project>

除了要把每個檔案都加進去 ItemGroup ,有兩個屬性要知道:

  • CopyToOutputDirectory 設定是否複製至輸出資料夾,有以下三個設定值
    Never
    Always
    PreserveNewest
    
  • DependentUpon 設定此檔案依賴於哪個主要檔案

如此一來,我們的專案的檔案結構就變得漂亮多了。

組態設定的使用

永遠不要將密碼或其他敏感性資料儲存在組態設定檔中 (盡量啦…),絕對不要在開發或測試環境中使用生產環境的密鑰,最好的做法是在專案外部指定,防止沒有授權的人存取原始碼時,取得不該看到的資訊,因此開發時期可以透過 Secret Manager 或是環境變數來存放敏感資訊,會是個好方法。

若是使用環境變數來指定的組態值,冒號 ( : ) 可能無法在所有平台上運作,建是使用雙底線 ( __ ) 來對環境變數命名,以取得所有平台的支援。

然而在 ConfigurationBuilder 中,我們還是可以在所有平台上,透過冒號 ( : ) 的方法取得階層的組態設定值。

本篇完整範例程式碼請參考 poychang/Demo-Config-Console-App

參考資料:


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Open Data Structures

Open Data Structures

Pat Morin / AU Press / 2013-6 / USD 29.66

Offered as an introduction to the field of data structures and algorithms, Open Data Structures covers the implementation and analysis of data structures for sequences (lists), queues, priority queues......一起来看看 《Open Data Structures》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具