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__
| Key | Description |
DataSource__Provider | ประเภทฐานข้อมูลหลัก ดูค่าที่รองรับได้จากตาราง Provider ด้านล่าง |
DataSource__ConnectionString | Connection string สำหรับเชื่อมต่อฐานข้อมูลหลัก format ขึ้นอยู่กับแต่ละ provider |
DataSource__<ชื่อ DataSource ของคุณ>__Provider | ประเภทฐานข้อมูลรอง ดูค่าที่รองรับได้จากตาราง Provider ด้านล่าง |
DataSource__<ชื่อ DataSource ของคุณ>__ConnectionString | Connection string สำหรับเชื่อมต่อฐานข้อมูลรอง format ขึ้นอยู่กับแต่ละ provider |
ตัวอย่าง
# ฐานข้อมูลหลัก
DataSource__Provider=ORACLE
DataSource__ConnectionString=Data Source=...
# ฐานข้อมูลรอง (Local)
DataSource__Local__Provider=MSSQL
DataSource__Local__ConnectionString=Data Source=...Provider ที่รองรับ
| ค่าที่ใส่ใน .env | ฐานข้อมูล |
ORACLE | Oracle Database |
MSSQL หรือ SQLSERVER | Microsoft SQL Server |
POSTGRESQL | PostgreSQL |
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;
}