這裡先不討論是否適合廣泛使用 Trigger 開發系統邏輯,以及使用 Trigger 的便利性以及除錯上帶來的麻煩,這裡僅討論 Kuick Entity 實作的 Instance 事件機制,如何替代資料庫的 Trigger 功能。
每一種資料庫對於 Trigger 有不同的實作,以 SQL Server 而言,分成 DDL Triggers 與 DML Triggers 兩類。Kuick Entity 所關注的在於 Entity 本身,提供的事件機制功能所處理的範圍與 DML Triggers 相似又有些不同,接下來說明 Kuick Entity 的 8 個資料處理事件如何達成 DDL Triggers 可以完成的功能。
以 DML 的 4 種資料操作語法 Select, Insert, Update, Delete,再區分成操作前與操作後,Kuick Entity 僅包含以下 8 種資料處理事件
1. OnInit 物件初始事件
由於事件處理屬於 Instance 範圍,在還未產生 Instance 之前,只有藉由事件處理方法仿事件處理器功能,IEntity 定義 OnInit 方法,可以透過 override OnInit 方法達成物件初始化處理。
[EntitySpec]
public class UserEntity : Entity<UserEntity>
{
public override void OnInit(object sender, EntityEventArgs e)
{
// todo..
base.OnInit(sender, e);
}
}
2. AfterSelect 選取後事件
[EntitySpec]
public class UserEntity : Entity<UserEntity>
{
public UserEntity()
{
base.AfterSelect += new InstanceEventHandler(UserEntity_AfterSelect);
}
private void UserEntity_AfterSelect(IEntity sender)
{
// todo
}
}
3. BeforeAdd 新增前事件
[EntitySpec]
public class UserEntity : Entity<UserEntity>
{
public UserEntity()
{
base.BeforeAdd += new EntityEventHandler(UserEntity_BeforeAdd);
}
private void UserEntity_BeforeAdd(IEntity sender, EntityEventArgs e)
{
// todo
}
}
4. AfterAdd 新增後事件
[EntitySpec]
public class UserEntity : Entity<UserEntity>
{
public UserEntity()
{
base.AfterAdd += new EntityEventHandler(UserEntity_AfterAdd);
}
private void UserEntity_AfterAdd(IEntity sender, EntityEventArgs e)
{
// todo
}
}
5. BeforeModify 修改前事件
[EntitySpec]
public class UserEntity : Entity<UserEntity>
{
public UserEntity()
{
base.BeforeModify += new EntityEventHandler(UserEntity_BeforeModify);
}
private void UserEntity_BeforeModify(IEntity sender, EntityEventArgs e)
{
// todo
}
}
6. AfterModify 修改後事件
[EntitySpec]
public class UserEntity : Entity<UserEntity>
{
public UserEntity()
{
base.AfterModify += new EntityEventHandler(UserEntity_AfterModify);
}
private void UserEntity_AfterModify(IEntity sender, EntityEventArgs e)
{
// todo
}
}
7. BeforeRemove 刪除前事件
[EntitySpec]
public class UserEntity : Entity<UserEntity>
{
public UserEntity()
{
base.BeforeRemove += new EntityEventHandler(UserEntity_BeforeRemove);
}
private void UserEntity_BeforeRemove(IEntity sender, EntityEventArgs e)
{
// todo
}
}
8. AfterRemove 刪除後事件
[EntitySpec]
public class UserEntity : Entity<UserEntity>
{
public UserEntity()
{
base.AfterRemove += new EntityEventHandler(UserEntity_AfterRemove);
}
private void UserEntity_AfterRemove(IEntity sender, EntityEventArgs e)
{
// todo
}
}
========================================
鐵人賽分享列表:Kuick Application & ORM Framework
開放原始碼專案:kuick.codeplex.com
直接下載原始碼:Kuick
下載相關文件檔:C# Code Conventions and Design Guideline
相關教學影片區:Kuick on YouTube