實體處理模塊IEntityModule
在2015年7月16日,XCode新增了實體處理模塊IEntityModule,用於攔截實體對象添刪改操作。
該接口參考IHttpModule設計理念,橫切在實體對象的關鍵生命周期之中,以達到多實體類通用處理的效果。比如為多個實體類增加假刪除等特色功能。
/// <summary>實體處理模塊</summary> public interface IEntityModule { /// <summary>為指定實體類初始化模塊,返回是否支持</summary> /// <param name="entityType"></param>/// <returns></returns> Boolean Init(Type entityType); /// <summary>創建實體對象</summary> /// <param name="entity"></param> /// <param name="forEdit"></param> void Create(IEntity entity, Boolean forEdit); /// <summary>驗證實體對象</summary> /// <param name="entity"></param> /// <param name="isNew"></param> /// <returns></returns> Boolean Valid(IEntity entity, Boolean isNew); /// <summary>刪除實體對象</summary> /// <param name="entity"></param>Boolean Delete(IEntity entity); }
我們來看一段接口例程:
class TestModule : EntityModule { protected override Boolean OnInit(Type entityType) { return entityType == typeof(UserX); } protected override Boolean OnValid(IEntity entity, Boolean isNew) { if (isNew) XTrace.WriteLine("新增實體 " + entity.GetType().Name); else XTrace.WriteLine("更新實體 " + entity.GetType().Name); return base.OnValid(entity, isNew); } protected override Boolean OnDelete(IEntity entity) { XTrace.WriteLine("刪除實體 " + entity.GetType().Name); return base.OnDelete(entity); } public static void Test() { EntityModules.Global.Add<TestModule>(); var user = new UserX { Name = "Stone", RoleID = 1 }; user.Save(); user.Name = "大石頭"; user.Update(); user.Delete(); } }
模塊TestModule繼承自抽象基類EntityModule,它實現了IEntityModule接口的基本功能。
EntityModules.Global.Add<TestModule>(); 用於把該模塊註冊成為全局處理模塊
也可以註冊到具體單個實體類裏面,比如 UserX.Meta.Modules.Add<TestModule>();
Init方法用於判斷指定實體類是否需要執行過濾模塊,只有它返回true,後面的接口方法才會被調用。
OnValid等同於實體類的Valid,新增或修改實體對象時會調用,通過isNew參數區分。因為絕大多數業務邏輯的新增和修改都有關系,所以把它們做到一塊。
OnDelete就是刪除攔截啦。如果想做假刪除,就是在這裏把刪除標記字段改為true,然後entity.Update保存,接著返回false讓外部不要繼續執行Delete
在XCode內部,有三個最常用的接口實現:UserModule、TimeModule、IPModule
它們的功能如下:
1,新增時CreateUserID使用當前登錄用戶(通過IManageProvider接口獲取),新增修改時UpdateUserID使用當前登錄用戶
2,新增時CreateTime使用當前時間,新增修改時UpdateTime使用當前時間
3,新增時CreateIP使用當前訪問地址(通過WebHelper.UserHost),新增修改時UpdateIP使用當前訪問地址
所以,這六個字段赫赫有名,就寫在NX001軟件設計標準裏面。
一般在需要用到的實體類靜態構造函數裏面註冊使用。
static Shard() { // 過濾器 UserModule、TimeModule、IPModule Meta.Modules.Add<UserModule>(); Meta.Modules.Add<TimeModule>(); Meta.Modules.Add<IPModule>(); }
實際使用中,只要一個團隊遵循統一的數據庫設計規範,就一定可以抽象出來許多IEntityModule實現!
實體處理模塊IEntityModule