資料初始化需求分成 2 種情況:
<一次性的資料建立>
一次性的需求來自於系統部署時,資料建立可以採取匯入資料庫備份檔,或是執行一段 Sql 指令達成目的,這些動作可能手動完成,也可能在安裝檔裡執行。
<每一次的資料處理>
每一次系統啟動,可能需要確保管理者帳號存在,也可能需要寄送 Email 或是複製檔案。
Kuick 專注在『每一次系統啟動的資料處理』,接下來說明,開發者要如何定義資料處理程式?系統啟動如何能確保處理程式必定執行?
在 Kuick.IStart 介面裡,定義 Kuick Application 啟動處理程序,所有實作 IStart 介面的類別,都將在系統啟動時載入並執行。對於每一次系統啟動的資料處理,我們再細分成兩類:
1. 被其他依存的資料初始
這部份的處理需求,請將程式寫在實作 Kuick.IStart 介面的類別裡的 DoPostDatabaseStart 事件處理器裡。
2. 沒有被其他依存的資料初始
這部份的處理需求,請將程式寫在實作 Kuick.IStart 介面的類別裡的 DoPostStart 事件處理器裡。
接下來用一個例子說明,如何分辦程式該實作於 DoPostDatabaseStart 還是 DoPostStart 裡:
RoleEntity, UserEntity
using System;
using System.Collections.Generic;
using Kuick.Data;
using Kuick;
namespace Sample
{
[EntitySpec]
public class RoleEntity : Entity<RoleEntity>
{
[ColumnSpec(SpecFlag.PrimaryKey)]
public string RoleID { get; set; }
[ColumnSpec]
public string Name { get; set; }
}
[EntitySpec]
public class UserEntity : Entity<UserEntity>
{
[ColumnSpec(SpecFlag.PrimaryKey)]
public string UserName { get; set; }
[ColumnSpec]
[ColumnRefer(typeof(RoleEntity))]
public string RoleID { get; set; }
}
}
RoleEntity 被 UserEntity 依存,所以 RoleEntity 的資料初始化,必需實作在 DoPostDatabaseStart 事件處理器裡。
UserEntity 沒有被其他依存,所以 UserEntity 的資料初始化,必需實作在 DoPostStart 事件處理器裡。
OrganizationStart
using System;
using Kuick;
namespace Sample
{
public class OrganizationStart : IStart
{
// Start
public void DoPreStart(object sender, EventArgs e)
{
}
public void DoBuiltinStart(object sender, EventArgs e)
{
}
public void DoPluginStart(object sender, EventArgs e)
{
}
public void DoPreDatabaseStart(object sender, EventArgs e)
{
}
public void DoDatabaseStart(object sender, EventArgs e)
{
}
public void DoPostDatabaseStart(object sender, EventArgs e)
{
if(!RoleEntity.Exists("Admin")) {
RoleEntity role = new RoleEntity();
role.RoleID = "Admin";
role.Name = "Administrators";
role.Add();
}
}
public void DoPostStart(object sender, EventArgs e)
{
if(!UserEntity.Exists("Kuicker")) {
UserEntity user = new UserEntity();
user.UserName = "Kuicker";
user.RoleID = "Admin";
user.Add();
}
}
// Terminate
public void DoPluginTerminate(object sender, EventArgs e)
{
}
public void DoBuiltinTerminate(object sender, EventArgs e)
{
}
public void DoPostTerminate(object sender, EventArgs e)
{
}
}
}
依據過往經驗,沒有被其他依存的資料初始需求相對來得多,所以提供另一個機制,程式可以寫在實作 Kuick.IInitializer 介面的類別裡的 Initiate 方法裡,由於要確保這段程式僅在系統啟動階段執行,另外提供實作 IInitializer 的基底類別 Initializer,以 OnInit 方法作為程式撰寫處。
OrganizationInitializer
using System;
using Kuick;
namespace Sample
{
public class OrganizationInitializer : Initializer
{
protected override void OnInit()
{
if(!UserEntity.Exists("Kuicker")) {
UserEntity user = new UserEntity();
user.UserName = "Kuicker";
user.RoleID = "Admin";
user.Add();
}
}
}
}
========================================
鐵人賽分享列表:Kuick Application & ORM Framework
開放原始碼專案:kuick.codeplex.com
直接下載原始碼:Kuick
下載相關文件檔:C# Code Conventions and Design Guideline
相關教學影片區:Kuick on YouTube