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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

ASP.NET Core管道深度剖析(3):管道是如何处理HTTP请求的?

我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但是就具体的实现来说,由于其中涉及很多对象的交互...

3015
来自专栏大内老A

了解ASP.NET MVC几种ActionResult的本质:JavaScriptResult & JsonResult

在之前的两篇文章(《EmptyResult & ContentResult》和《FileResult》)我们剖析了EmptyResult、ContentResu...

2358
来自专栏有趣的django

32.Django form组件

Form组件  Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面...

3329
来自专栏Jackson0714

03.如何实现一个遥控器-命令模式

3597
来自专栏大内老A

通过一个模拟程序让你明白WCF大致的执行流程

在《通过一个模拟程序让你明白ASP.NET MVC是如何运行的》一文中我通过一个普通的ASP.NET Web程序模拟了ASP.NET MVC的执行流程,现在我们...

2166
来自专栏游戏开发那些事

【游戏开发】Excel表格批量转换成lua的转表工具

  在上篇博客《【游戏开发】Excel表格批量转换成CSV的小工具》 中,我们介绍了如何将策划提供的Excel表格转换为轻便的CSV文件供开发人员使用。实际在U...

2603
来自专栏大内老A

ASP.NET MVC涉及到的5个同步与异步,你是否傻傻分不清楚?[上篇]

Action方法的执行具有两种基本的形式,即同步执行和异步执行,而在ASP.NETMVC的整个体系中涉及到很多同步/异步的执行方式,虽然在前面相应的文章中已经对...

2326
来自专栏智能大石头

实体处理模块IEntityModule

在2015年7月16日,XCode新增了实体处理模块IEntityModule,用于拦截实体对象添删改操作。 该接口参考IHttpModule设计理念,横切在实...

19910
来自专栏圣杰的专栏

ABP入门系列(11)——编写单元测试

源码路径:Github-LearningMpaAbp 1. 前言 In computer programming, unit testing is a soft...

3128
来自专栏玩转JavaEE

Redis中的五种数据类型简介

上篇文章我们介绍了如何在Linux中安装Redis,本文我们来了解下Redis中的五种数据类型。 本文是Redis系列的第二篇文章,了解前面的文章有助于更好的理...

3807

扫码关注云+社区

领取腾讯云代金券