实体处理模块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实现!

时间: 2024-10-10 15:03:48

实体处理模块IEntityModule的相关文章

Swift学习笔记7--访问控制

在Swift语言中,访问修饰符有三种,分别为private,internal和public.同时,Swift对于访问权限的控制,不是基于类的,而是基于文件的.其区别如下: 1,private private访问级别所修饰的属性或者方法只能在当前的Swift源文件里可以访问. 2,internal(默认访问级别,internal修饰符可写可不写) internal访问级别所修饰的属性或方法在源代码所在的整个模块都可以访问. 如果是框架或者库代码,则在整个框架内部都可以访问,框架由外部代码所引用时,

版权控制

http://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/chapter2/23_Access_Control.html 本页内容包括: 模块和源文件 访问级别 访问级别的使用原则 默认访问级别 单目标应用程序的访问级别 Framework的访问级别 访问控制语法 自定义类型 元组类型 函数类型 枚举类型 原始值和关联值 嵌套类型 子类 常量.变量.属性.下标 Getter和Setter 初始化 默认初始化方法 结构

如何向妻子解释OOD

原文:如何向妻子解释OOD 前言 此文译自CodeProject上一文,该文章在Top Articles上排名第3,读了之后觉得非常好,就翻译出来,供不想读英文的同学参考学习. 作者(Shubho)的妻子(Farhana)打算重新做一名软件工程师(她本来是,后来因为他们孩子出生放弃了),于是作者就试图根据自己在软件开发设计方面的经验帮助她学习面向对象设计(OOD). 自作者从事软件开发开始,作者常常注意到不管技术问题看起来多复杂,如果从现实生活的角度解释并以对答的方式讨论,那么它将变得更简单.现

android源码大放送(实战开发必备),免费安卓demo源码,例子大全文件详细列表

免费安卓demo源码,例子大全文件详细列表 本列表源码永久免费下载地址:http://www.jiandaima.com/blog/android-demo 卷 yunpan 的文件夹 PATH 列表 卷序列号为 0000-73EC E:. │ jiandaima.com文件列表生成.bat │ 例子大全说明.txt │ 本例子永久更新地址~.url │ 目录列表2016.03.10更新.txt │ ├─前台界面 │ ├─3D标签云卡片热门 │ │ Android TagCloudView云标签

【设计模式】 面向对象六大设计原则

面向对象设计的六大原则 : 单一职责原则, 里氏替换原则, 依赖倒置原则, 接口隔离原则, 迪米特法则, 开闭原则; 一. 单一职责原则 1. 单一职责简介 单一职责定义 : 有且只有一个原因引起类的变化, 一个接口 或者 类 只有一个职责; 单一职责的好处 : -- 复杂性 : 降低类的复杂性, 对类或接口的职责有清晰明确定义; -- 可读性 : 提高可读性; -- 维护 : 提高可维护性; -- 变更风险 : 降低变更引起的风险, 接口改变只影响相应的实现类, 不影响其他类; 2. 单一职责

XCode v9.6.2017.0830

新生命团队基础框架X组件,包括网络.数据库.安全.多线程.反射.序列化.模版引擎.服务代理.远程过程调用等模块,包括Mvc后台魔方.超级码神工具.消息队列等子系统,支持Mono/Android/iOS/NetStandard. 新生命开发团队 网站:http://www.NewLifeX.comQQ群:1600800 项目源码位置 国内 http://git.NewLifeX.com/NewLife/X国外 https://github.com/NewLifeX/X 数据中间件XCode主要功能

cad二次开发--添加对象到模型空间中

通过实体名来将实体加入到模型空间 AcDbObjectId PostToModelSpace(AcDbEntity *pEnt){ //打开块表 AcDbBlockTable *pBlockTable = NULL; Acad::ErrorStatus es = acdbHostApplicationServices()->workingDatabase() ->getBlockTable(pBlockTable, AcDb::kForRead); //打开块表记录 AcDbBlockTabl

6、六大设计原则

单一职责原则 单一职责原则: 就一个类而言, 应该仅有一个引起它变化的原因. 日常编程, 我们习惯性的很自然给一个类加这样那样的功能, 比如之前讲过的计算器, 很可能我们会设计出一个类, 把计算 显示等功能都写那个类中, 这样的代码维护很麻烦, 复用不可能, 也缺乏灵活性, 因此我们对那个类进行了重构才引出了简单工厂模式和策略模式. 如果一个类承担的职业过多, 就等于把这些职责耦合在一起, 一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力. 这种耦合会导致脆弱的设计, 当变化发生时, 设

CAMTEK_PEPS_WIREV5.2.32 慢走丝线切割软件,多语言含简体中文版,带多种机床后处理\

切割软件 Camtek PEPS v5.3.12 MultiLanguage-ISO 2CDCAMTEK_PEPS_WIREV5.2.32 慢走丝线切割软件,多语言含简体中文版,带多种机床后处理\ Camtek 自1983年成立以来,PEPS CADCAM软件就受到用户的一致好评.以下是PEPS CADCAM主要产品. 铣削软件 支持2-3轴铣削加工与多轴多面体加工包括钻削,平面铣,挖槽,轮廓铣等加工方式,提供参数化通用实体库进行加速加工. 三维曲面铣削 应用于3轴数控铣床与加工中心以实体建模技