实体处理模块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 =
};
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的更多相关文章
- 在eclipse中使用Maven分模块搭建SSM框架,创建jar、war、pom工程模块教学,项目的热部署,需要的可以留下邮箱,给大家发整理过的Maven笔记
第一章:Maven概述 (1)Maven是一个项目构建工具,由apache提供,用Java开发的 (2)构建工具:Ant(蚂蚁),Maven(专家) (3)构建工具作用:帮助程序员进行项目的创建,目录 ...
- 命名实体识别学习笔记——使用Ltp
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/xuewenstudy/article/d ...
- 8.HanLP实现--命名实体识别
笔记转载于GitHub项目:https://github.com/NLP-LOVE/Introduction-NLP 8. 命名实体识别 8.1 概述 命名实体 文本中有一些描述实体的词汇.比如人名. ...
- Reface.AppStarter 类型扫描 —— 获得系统中所有的实体类型
类型扫描 是 Reface.AppStarter 提供的最基本.最核心的功能. AutoConfig , ComponentScan 等功能都是基于该功能完成的. 每一个使用 Reface.AppSt ...
- SpringBoot+Maven 多模块项目的构建、运行、打包实战
前言 最近在做一个很复杂的会员综合线下线上商城大型项目,单模块项目无法满足多人开发和架构,很多模块都是重复的就想到了把模块提出来,做成公共模块,基于maven的多模块项目,也好分工开发,也便于后期微服 ...
- 转:如何向妻子解释OOD
如何向妻子解释OOD 前言 此文译自CodeProject上<How I explained OOD to my wife>一文,该文章在Top Articles上排名第3,读了之后觉得非 ...
- OC基础--多态 及 三特性小练习
什么是多态 什么是多态: 多态就是某一类事物的多种形态 猫: 猫-->动物 狗: 狗-->动物 男人 : 男人 -->人 -->动物 女人 : 女人 -->人 --> ...
- 爱上MVC~一个Action多套View模版的设计
回到目录 模块化 这个问题是在做模块化设计时出现的,在Lind.DDD.Plugins模块里,需要对应的模块实体,模块管理者,模块标识接口等,开发时,如果你的功能点属于一个模块,需要实现IPlugin ...
- JDK注解替代Hibernate的Entity映射
1.在entity(实体类)模块中使用注解 1_1.注解的位置出现在 [类定义的前面] 和 [属性的get方法前面] [属性的get方法前面] Java代码: package app.entity; ...
随机推荐
- JAVA-UML
UML(UnifiedModelingLanguage)(统一建模语言或标准建模语言) 它是模型化的软件系统开发图形语言 为软件开发所有阶段提供模型化,可视化支持 UM2.2中定义了14中图示 三种常 ...
- java并发编程的艺术——第一章总结
并发编程的挑战 1.1上下文切换 1.2死锁 1.3资源限制的挑战 1.4本章小结 1.1上下文切换 1.1.1多线程一定快吗 1.1.2测试上下文切换次数和时长 1.1.3如何减少上下文切换 1.1 ...
- CrawlSpiders
1.用 scrapy 新建一个 tencent 项目 2.在 items.py 中确定要爬去的内容 # -*- coding: utf-8 -*- # Define here the models f ...
- pycharm运行scrapy
1.打开pycharm, 点击File>Open找到mySpider项目导入 . 2.打开File>Settings>Project 点击Project Interpreter 右边 ...
- PHP对象注入 PHP Object Injection
From:PHP Object Injection Last revision (mm/dd/yy): 01/7/2015 译者:李秋豪 Wednesday, 24. May 2017 05:48PM ...
- Linux useradd
在 linux 中,如果我们想添加一个用户,那么使用的命令如下: useradd [ 用户名 ] 实例如下: 那么添加密码如下: passwd [ 用户名 ] 实例如下: 然后输入密码,学过一点 ...
- .Net6种成员的可访问性
CLR术语 C#术语 描述 Private private 成员只能由定义类型或任何嵌套类型访问 Family protected 成员只能由定义类型,任何嵌套类型或者不管在任何程序集中声明的派生类型 ...
- iOS MJRefresh下拉、上拉刷新自定义以及系统详细讲解
更新: MJRefresh 更新功能,默认根据数据来源 自动显示 隐藏footer,这个功能可以关闭 DoctorTableView.mj_footer.automaticallyHidden = N ...
- ES6中Promise对象个人理解
Promise是ES6原生提供的一个用来传递异步消息的对象.它减少了传统ajax金字塔回调,可以将异步操作以同步操作的流程表达出来使得代码维护和可读性方面好很多. Promise的状态: 既然是用来传 ...
- [置顶]
bootstrap自定义样式-bootstrap侧边导航栏的实现
前言 bootstrap自带的响应式导航栏是向下滑动的,有时满足不了个性化的需求,需要做一个类似于android drawerLayout 侧滑的菜单,这就是我要实现的bootstrap自定义侧滑菜单 ...