系統總會有一些內建資料,如果可以依據程式邏輯自動建立,這將可以有效避免部署的錯誤。Kuick系統生命周期,可以在啟動的不同步驟裡自動執行特定程式,我們將使用這個機制自動維護後台系統管理者的帳號資料。
引用 Kuick 開發的系統,只要有實作 Kuick.IStart 介面的類別,在系統完成啟動前必定會被執行,我們就藉這個機制進行後台內建的資料初始化。
首先,在 Kuick.Labs.IronMan6 類別庫裡新增實作 IStart 的類別 IronMan6Start。
// IStart 介面
public interface IStart
{
// 系統啟動執行功能
// 1. 系統啟動前
void DoPreStart(object sender, EventArgs e);
// 2. 內建服務啟動
void DoBuiltinStart(object sender, EventArgs e);
// 3. 資料庫啟動前
void DoPreDatabaseStart(object sender, EventArgs e);
// 4. 資料庫啟動
void DoDatabaseStart(object sender, EventArgs e);
// 5. 資料庫啟動後
void DoPostDatabaseStart(object sender, EventArgs e);
// 6. 系統啟動後
void DoPostStart(object sender, EventArgs e);
// 系統終結執行功能
// 1. 系統啟動前
void DoBuiltinTerminate(object sender, EventArgs e);
// 2. 系統啟動前
void DoPostTerminate(object sender, EventArgs e);
}
系統需要自動建立1個管理者角色 (manager)、1個管理人員 (admin),並且將 admin 加入 manager 裡。所以在 DoPostDatabaseStart 的方法裡實作以下程式:
public void DoPostDatabaseStart(object sender, EventArgs e)
{
string ADMIN = "admin";
string MANAGER = "manager";
Result result = null;
// EmployeeEntity
// 員工 admin
EmployeeEntity admin = EmployeeEntity.Get(ADMIN);
if(null == admin) {
admin = new EmployeeEntity();
admin.EmployeeID = ADMIN;
admin.Password = "IronMan6";
admin.FullName = "管理者";
result = admin.Add();
if(!result.Success) {
Logger.Error(result);
throw new KException("員工資料設定錯誤", result);
}
}
// RoleEntity
// 管理者角色 manager
RoleEntity manager = RoleEntity.Get(MANAGER);
if(null == manager) {
manager = new RoleEntity();
manager.RoleID = MANAGER;
manager.Name = "管理者角色";
result = manager.Add();
if(!result.Success) {
Logger.Error(result);
throw new KException("管理者角色設定錯誤", result);
}
}
// 員工 admin 屬於 manager 管理者角色成員
if(!admin.Mapping<RoleEntity>().Exists(MANAGER)) {
result = admin.Mapping<RoleEntity>().Add(MANAGER);
if(!result.Success) {
Logger.Error(result);
throw new KException("角色成員設定錯誤", result);
}
}
}
為了避免重複建立資料,所以都會在判定該筆資料不存在的時候才新增,最後利用 Kuick.Builtin.Mapping 服務,建立 admin 與 manager 的關係。