Rafy 框架 - 时间戳插件

本文将解释 Rafy 框架中的时间戳插件的场景、使用方法、原理。
场景
在开发各类数据库应用系统时,业务领域实体往往需要包含“创建时间”、“最后更新时间”、“创建人”、“最后更新人”等跟踪戳属性。这些属性是领域实体的基本属性,几乎所有的领域业务操作都会使用到这些属性,如:创建业务数据肯定会保存创建时间、创建人;更新业务数据需要记录最后更新时间;查询业务数据需要显示创建人等。
时间戳插件可以自动在数据层维护这些属性,使开发人员专注与业务逻辑开发,减少业务无关基本操作所占用的时间。
使用方法
开发人员在业务领域实体实现时间戳功能时,只需要引用该插件。引用后系统中所有实体都会自动添加时间戳属性,同时仓库中所有数据库操作都会增加时间戳属性。
步骤
通过 Nuget Package Manager 搜索并安装 Rafy.Domain.Stamp 插件。

在 DomainApp 中添加该插件:
class JXCApp : DomainApp
{
protected override void InitEnvironment()
{
//添加时间戳插件到 Rafy 应用程序集中。
RafyEnvironment.DomainPlugins.Add(new Rafy.Domain.Stamp.StampPlugin());
RafyEnvironment.DomainPlugins.Add(new JXCPlugin());
base.InitEnvironment();
}
}
添加时间戳插件后,默认所有实体自动注册时间跟踪戳属性。
效果
经过上面两步设置,User 实体类就已经开启了时间戳跟踪功能,并对实体会有以下的影响:
所有继承自 Entity 的实体都会统一添加四个跟踪戳字段。
运行程序后,数据库中的字段,已经自动添加上跟踪戳字段了:

执行保存实体时,框架自动给跟踪戳字段赋值。
INSERT INTO
[User] ([CreatedTime],[CreatedUser],[UpdatedTime],[UpdatedUser],[CreateTime],[Name])
VALUES
('2016-07-18 15:14:45','','2016-07-18 15:14:45','','2000-01-01 00:00:00','用户1')
在用户已登录的情况下,Rafy会从前上下文中获取当前用户身份,并给CreatedUser、UpdatedUser字段赋值。
原理
在 Rafy 框架的基础上,以插件的形式对 Rafy 框架中实体的数据层进行了扩展。在Rafy运行环境中加入时间戳插件后,领域中的所有实体默认注册四个跟踪戳属性;同时数据层拦截的提交操作,在添加、更新实体时,设置实体的跟踪戳。
/// <summary>
/// 拦截数据层的提交操作。在添加、更新实体时,设置实体的跟踪戳。
/// </summary>
public class StampSubmitInterceptor : SubmitInterceptor
{
/// <summary>
/// 提交指定的实体,并在添加、更新实体时,设置实体的跟踪戳。
/// </summary>
/// <param name="e">The e.</param>
/// <param name="link">The link.</param>
protected override void Submit(SubmitArgs e, ISubmitInterceptorLink link)
{
//...
ResetStamp(e);
//...
}
internal static void ResetStamp(SubmitArgs e)
{
...
switch (e.Action)
{
//...
case SubmitAction.Update:
var entity = e.Entity;
entity.SetUpdatedTime(DateTime.Now);
var user1 = RafyEnvironment.Identity;
entity.SetUpdatedUser(user1.Name);
break;
case SubmitAction.Insert:
var entity2 = e.Entity;
var now = DateTime.Now;
entity2.SetUpdatedTime(now);
entity2.SetCreatedTime(now);
var user2 = RafyEnvironment.Identity;
entity2.SetUpdatedUser(user2.Name);
entity2.SetCreatedUser(user2.Name);
break;
//...
}
}
}
PS:该文已经纳入《Rafy 用户手册》中。
Rafy 框架 - 时间戳插件的更多相关文章
- Rafy 框架 - 流水号插件
Rafy 框架又添新成员:流水号插件.本文将解释 Rafy 框架中的流水插件的场景.使用方法. 场景 在开发各类数据库应用系统时,往往需要生成从一开始的流水号,有时还需要按月或者按日进行独立生成,如下 ...
- Rafy 框架 - 幽灵插件(假删除)
Rafy 框架又添新成员:幽灵插件.本文将解释该插件的场景.使用方法.原理. 场景 在开发各类数据库应用系统时,往往需要在删除数据时不是真正地删除数据,而只是把数据标识为'已删除'状态.这些数 ...
- 使用 NuGet 下载最新的 Rafy 框架及文档
为了让开发者更方便地使用 Rafy 领域实体框架,本月,我们已经把最新版本的 Rafy 框架程序集发布到了 nuget.org 上,同时,还把 RafySDK 的最新版本发布到了 VisualStud ...
- Rafy 框架 - 使用 SqlTree 查询
本文介绍如何使用 Rafy 框架中的 Sql Tree 查询: 除了开发者常用的 Linq 查询,Rafy 框架还提供了 Sql 语法树的方式来进行查询. 这种查询方式下,开发者不需要直接编写真正的 ...
- Rafy框架
l 什么是Rafy框架? -------- Rafy 是一个面向企业级开发的插件化快速开发框架. l Rafy的优点是什么? ------快速开发.产品线工程.一套代码可同时生成并运行 C/S.单 ...
- Rafy 框架:领域控制器
本文简要说明如何使用 Rafy 框架中的领域控制器. 简介 领域控制器是 Rafy 框架中用于封装领域逻辑的主要方式. 在控制器中,开发者可以封装大量的业务逻辑,并向外暴露业务接口.内部的逻辑在实现时 ...
- Rafy 框架 - 通用查询条件(CommonQueryCriteria)
在应用开发过程中,有 80% 的场景下,开发者所需要的实体查询,查询条件中其实都是一些简单的属性匹配,又或是一些属性匹配的简单组合.Rafy 为这样的场景提供了更为方便使用的 API:CommonQu ...
- 一位同事对 Rafy 框架的一些建议及我的回复
下面是一位同事对当前的产品开发框架提出的一些建议,以及我的回复.我觉得一些问题提得有一定的代表性,在征得本人同意后,将本邮件发布在博客中. 同时,也非常希望对框架.产品有好的建议的小伙伴,都可以给我发 ...
- 快速开发~Rafy框架的初步认识
当我们开始使用EF的同时,是不是就会更好的认识了其他的ORM框架,最近接触了Rafy的使用,感觉还是蛮有兴趣去学习的,虽然最初的我到现在看的并不深入,但是我个人感觉还是可以简单地做一些总结的啦,或许语 ...
随机推荐
- 2059 - Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(../Frameworks/caching_sha2_password.so, 2): image not found
mac本地安装mysql后,navicat连接报错: - Authentication plugin ): image not found 解决方法 在控制台登陆后重新改下密码即可 ALTER USE ...
- opencontrail—VXLAN模式下数据包的传输过程
在这篇文章中,我们将看到VM生成的数据包如何能够到达另一个VM或外部资源,Neutron使用OpenContrail插件的上下文中的关键概念/组件是什么. 我们将重点介绍OpenContrail,它如 ...
- 【dp】合唱队形
题目描述 NN位同学站成一排,音乐老师要请其中的(N-KN−K)位同学出列,使得剩下的KK位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,…,K,他们的身高分别为 ...
- Linux-Jenkins安装部署
Jenkins 安装及插件安装 Jenkins简介: Jenkins只是一个平台,真正运作的都是插件.这就是jenkins流行的原因,因为jenkins什么插件都有 Hudson是Jenkins的前身 ...
- Java集合的总结
参考博客: http://www.jianshu.com/p/63e76826e852 http://www.cnblogs.com/LittleHann/p/3690187.html https:/ ...
- localhost 和 127.0.0.1 认识
概念和工作原理 1.概念: localhost:也叫local ,正确的解释是:本地服务器 127.0.0.1:在windows等系统的正确解释是:本机地址(本机服务器) 2.工作原理 localho ...
- java第一课 面向对象的编程概念
一.什么是对象(object)? 对象是相关状态和行为的软件包. 1.现实社会的对象都有两个共同特征:状态和行为.如:狗有状态(名称,颜色,品种,饥饿)和行为(吠叫,取出,摇尾). 2.软件对象在概念 ...
- nginx日志格式定义和nginx.conf配置模板说明
在http的功能里添加log_format模块,内容如下: log_format main escape=json '{ "@timestamp": "$time_iso ...
- Oracle时间函数
YYYY年 Q季度 MM月 month月 WW当年第几周 W本月第几周 DDD 当年第几天 DD当月第几天 D当周内第几天 DY当周内星期几 day当周内星期几 HH或HH12:12进制小时数 HH2 ...
- centos7-aliyun
# 安装EPEL和IUS软件源 yum install epel-release -y yum install https://centos7.iuscommunity.org/ius-release ...