JSON Configuration ใน .NET Core

ใน .NET Core มันใช้ configuration ได้หลายแบบ แบบที่เป็นไฟล์ หลัก ๆ ก็ INI, JSON ไม่ก็ XML ทีนี้พอจะทำแอพที่เอา .NET Core ไปเข้า pipeline ของ ci/cd การทำ configuration file ก็เป็นทางเลือกที่น่าสนใจในการ manage configuration

ต้องเตือนไว้ก่อนว่า โดยปกติ มันไม่ควรเอา configuration ไว้ใน code base แล้วมา set profile ว่าเออ นี่จะ build สำหรับขึ้น production นะ อันนี้จะใช้ build ขึ้น staging นะ แต่ควรจะใช้ binary เดียว build ครั้งเดียว และใช้ configuration ในการจัดการควบคุม environment แทน

วิธีใช้ .NET Core วิธีการใช้ Configuration ก็เอามาจาก package Microsoft.Extensions.Configuration ตอน dotnet new บาง template ก็ using มาให้แล้ว เช่น webapi บาง template ก็ไม่ใส่มาให้ เช่น console ถ้าไม่มี เราก็แค่ใส่เข้าไปเองง่าย ๆ

dotnet add package Microsoft.Extensions.Configuration
dotnet add package Microsoft.Extensions.Configuration.FileExtensions
dotnet add package Microsoft.Extensions.Configuration.Json
dotnet add packageMicrosoft.Extensions.Configuration.EnvironmentVariables

เสร็จแล้วลองดู code นี้

using System;
using System.IO;
using Microsoft.Extensions.Configuration;

namespace dotnet_config {
    class Program {
        public static IConfigurationRoot Configuration { get; set; }
        static void Main (string[] args) {
            string environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
            var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .AddJsonFile($"appsettings.{environment}.json", optional: true)
                .AddEnvironmentVariables();

            Configuration = builder.Build();

            Console.WriteLine($"Environment Name from configuration file = {Configuration["Environment:Name"]}");
        }
    }
}

สิ่งที่มันทำก็แค่ load configuration จาก json file ที่ชื่อ appsettings.json มา แต่ถ้ามันเจอ appsettings.<ชื่อ environment>.json ก่อนมันก็เอาก่อน แต่ถ้าเจอใน environment variable ก่อนก็เอาอันนั้น

ใน appsettings.json มีหน้าตาแบบนี้

{
    "Environment": {
        "Name": "Production"
    }
}

ส่วน appsettings.Development.json มีหน้าตาแบบนี้

{
    "Environment": {
        "Name": "Development"
    }
}

พอเราสั่งรันแบบธรรมดา

dotnet run

มันก็จะแสดงว่า

แต่ถ้าเราระบุ environment ลงไปด้วย

ASPNETCORE_ENVIRONMENT=Development dotnet run

มันจะแสดงว่า

จะเห็นได้ว่ามันใช้ “:” เป็น delimiter ในการบ่งบอก depth ของ key ดังนั้น ถ้ามี ลึกกว่านี้ก็เอา : คั่นไปเรื่อย ๆ ที่เหลือก็แค่เอาค่าที่ได้จาก configuration ไปใช้ เป็นอันจบ

อ้างอิง

Leave a Reply