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的使用,感觉还是蛮有兴趣去学习的,虽然最初的我到现在看的并不深入,但是我个人感觉还是可以简单地做一些总结的啦,或许语 ...
随机推荐
- How To Configure NetScaler AppFlow for SolarWinds
How To Configure NetScaler AppFlow for SolarWinds 来源 https://support.citrix.com/article/CTX227300 A ...
- openflow packet_out和packet_in分析
任务目的 1. 掌握OpenFlow交换机发送Packet-in消息过程及其消息格式. 2. 掌握OpenFlow控制器发送Packet-out消息过程及其消息格式. 实验原理 Packet-In 使 ...
- did not finish being created even after we waited 189 seconds or 61 attempts. And its status is downloading
did not finish being created even after we waited 189 seconds or 61 attempts. And its status is down ...
- webpack中跨域请求proxy代理(vue与react脚手架不同设置方法)
因为浏览器有同源策略的限制,导致我们在本地开发的时候,请求不同域名的接口会存在跨域的问题 解决跨域的问题有很多方式,这里主要整理下代理模式来解决跨域的问题 代理方式能够实现的机制大体: 本地服务器 - ...
- CF 1145 (愚人节比赛)
D题 题目就是让你找出题面中拼错的单词,拼错的字母组合成一句话就是正确的题面. two plus xor of third and min elements #include<bits/stdc ...
- docker核心概念与配置安装
一.Docker的三大核心概念: 镜像(image) 容器(container) 仓库(repository) 1.Docker镜像类是与虚拟机镜像,可以把它理解为一个只读的模板. 不仅仅是操作系统 ...
- mysql 严格模式 Strict Mode说明(text 字段不能加默认或者 不能加null值得修改方法)
mysql 严格模式 Strict Mode说明 1.开启与关闭Strict Mode方法找到mysql安装目录下的my.cnf(windows系统则是my.ini)文件 在sql_mode中加入ST ...
- my live thinkcenter / ThinkCentre M920x Tiny / Thinkpad yoga 12 vPro
s 025-58816312 联想3C服务中心:栖霞区学海路鸿运家园1栋6室 / 珠江路华海大厦8楼联想服务中心 营业时间:周一至周日,9:00∼18:00 ThinkPad Yoga 12 i7 v ...
- asp.netMVC4使用Bootstrap4
使用: 添加: <script src="../../Scripts/jquery-1.7.1.min.js" type="text/javascript" ...
- Fatal error encountered during command execution
MySQL + .net + EF 开发环境,调用一处sql语句报错: Fatal error encountered during command execution[sql] view plain ...