Connect to database

AtlasX Web Service รองรับการเชื่อมต่อฐานข้อมูลหลายตัวพร้อมกัน โดยใช้ DataAccess library ผ่าน configuration ที่กำหนดใน environment variables

โดยในเวอร์ชันใหม่ได้ย้าย configuration จาก appsettings.json มาเก็บใน .env แทน เนื่องจาก appsettings.json มักถูก commit เข้า Git repository ทำให้ข้อมูลสำคัญอย่าง connection string และ credentials อาจหลุดออกไปพร้อมกับ source code ได้ การใช้ .env แก้ปัญหานี้โดย

  • ไฟล์ .env ถูกเพิ่มใน .gitignore จึงไม่ถูก commit เข้า Git
  • แต่ละ environment เช่น dev, staging, production มีค่าของตัวเองแยกกัน
  • ลด risk ที่ credentials จะหลุดไปกับ source code

การตั้งค่า

กำหนดค่าการเชื่อมต่อในไฟล์ .env โดยใช้ prefix DataSource__

KeyDescription
DataSource__Providerประเภทฐานข้อมูลหลัก ดูค่าที่รองรับได้จากตาราง Provider ด้านล่าง
DataSource__ConnectionStringConnection string สำหรับเชื่อมต่อฐานข้อมูลหลัก format ขึ้นอยู่กับแต่ละ provider
DataSource__<ชื่อ DataSource ของคุณ>__Providerประเภทฐานข้อมูลรอง ดูค่าที่รองรับได้จากตาราง Provider ด้านล่าง
DataSource__<ชื่อ DataSource ของคุณ>__ConnectionStringConnection string สำหรับเชื่อมต่อฐานข้อมูลรอง format ขึ้นอยู่กับแต่ละ provider

ตัวอย่าง

# ฐานข้อมูลหลัก 
DataSource__Provider=ORACLE 
DataSource__ConnectionString=Data Source=... 

# ฐานข้อมูลรอง (Local) 
DataSource__Local__Provider=MSSQL
DataSource__Local__ConnectionString=Data Source=...

Provider ที่รองรับ

ค่าที่ใส่ใน .envฐานข้อมูล
ORACLEOracle Database
MSSQL หรือ SQLSERVERMicrosoft SQL Server
POSTGRESQLPostgreSQL

Service Registration

1. โหลด Environment Variables

เรียก EnvironmentUtils.Load() ก่อน build application

EnvironmentUtils.Load();

2. ลงทะเบียน Service

เพิ่ม DataAccess เข้า DI container

builder.Services.AddDataAccess(builder.Configuration);

AddDataAccess() จะอ่าน configuration จาก section DataSource และลงทะเบียน AppDataAccess เป็น Singleton ใน DI container อัตโนมัติ

3. ลงทะเบียน AppDataAccess (เฉพาะฐานข้อมูลรอง)

เพิ่ม AppConnectionProfile ที่ AppDataAccess เพื่อให้เวลาเรียกใช้ AppDataAccess สามารถมองเห็นฐานข้อมูลรองได้

public record AppDataAccess : AppConnectionProfile
{
    public AppConnectionProfile Local { get; set; } = new();
}

การใช้งาน

Inject AppDataAccess

Inject AppDataAccess เข้า class ที่ต้องการใช้งานผ่าน constructor

public class MyService
{
    private readonly AppDataAccess _dataAccess;

    public MyService(AppDataAccess dataAccess)
    {
        _dataAccess = dataAccess;
    }
}

Execute Stored Procedure (ฐานข้อมูลหลัก)

เรียก Stored Procedure ผ่าน AppDataAccess โดยตรง

var parameters = new Dictionary<string, object>
{
    { "USERNAME", username },
    { "PASSWORD", password }
};

var result = await appDataAccess.ExecuteProcedureAsync("APP_LOGIN_Q", parameters);

if (!result.Success)
{
    return null;
}

Execute Stored Procedure (ฐานข้อมูลรอง)

เรียก Stored Procedure ผ่าน AppDataAccess.Local สำหรับฐานข้อมูลรอง

var parameters = new Dictionary<string, object>
{
    { "USERNAME", username },
    { "PASSWORD", password }
};

var result = await appDataAccess.Local.ExecuteProcedureAsync("APP_LOGIN_Q", parameters);

if (!result.Success)
{
    return null;
}