1. 程式人生 > >實體處理模塊IEntityModule

實體處理模塊IEntityModule

統一 需要 add else strong init 修改 creat 基類

在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