Rafy 框架 - 时间戳插件

本文将解释 Rafy 框架中的时间戳插件的场景、使用方法、原理。

场景

在开发各类数据库应用系统时,业务领域实体往往需要包含“创建时间”、“最后更新时间”、“创建人”、“最后更新人”等跟踪戳属性。这些属性是领域实体的基本属性,几乎所有的领域业务操作都会使用到这些属性,如:创建业务数据肯定会保存创建时间、创建人;更新业务数据需要记录最后更新时间;查询业务数据需要显示创建人等。

时间戳插件可以自动在数据层维护这些属性,使开发人员专注与业务逻辑开发,减少业务无关基本操作所占用的时间。

使用方法

开发人员在业务领域实体实现时间戳功能时,只需要引用该插件。引用后系统中所有实体都会自动添加时间戳属性,同时仓库中所有数据库操作都会增加时间戳属性。

步骤

  1. 通过 Nuget Package Manager 搜索并安装 Rafy.Domain.Stamp 插件。
  1. 在 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 用户手册》中。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java架构沉思录

10分钟了解ZooKeeper

ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。

11920
来自专栏技术博文

linux定时任务的设置

为当前用户创建cron服务 1.  键入 crontab  -e 编辑crontab服务文件       例如 文件内容如下:      */2 * * * *...

1.7K100
来自专栏技术翻译

使用Docker为Visual Studio Extensions创建专用存储库

如今的扩展和项目模板非常普遍; 我们每天都在Visual Studio中使用扩展。

17020
来自专栏ImportSource

教你看懂redis配置系列

摘要:最近工作中需要开发redis的一个云管理平台。所以要求要对这些参数了如指掌,特结合网络资料和自己翻译小撸此文。感谢junjie 【 简介】 我们可以在启动...

51090
来自专栏容器云生态

redis超时原因系统性排查

1.计算延迟时间: 使用–latency参数  以下参数表示平均超时时间0.03ms。 redis-cli --latency -h 127.0.0.1 ...

2.4K60
来自专栏散尽浮华

Linux下Redis主从复制以及SSDB主主复制环境部署记录

前面的文章已经介绍了redis作为缓存数据库的说明,本文主要说下redis主从复制及集群管理配置的操作记录: Redis主从复制(目前redis仅支持主从复制模...

37170
来自专栏信安之路

这些命令你用过多少?

在拿到一个 webshell 之后,大家首先会想到去把自己的权限提升到最高,windows 我们会提升到 SYSTEM 权限,而 Linux 我们会提升到 ro...

8810
来自专栏北京马哥教育

浅谈小白如何读懂Redis高速缓存与持久化并存及主从高可用集群

一、简介 Redis是一个基于键值(K-V)的高速缓存软件,和他具有相同功能的软件有memcached,但其支持更为复杂的数据结构,例如:List,set,s...

44770
来自专栏cs

linux学习笔记五

笔记摘抄自《linux操作系统基础及应用》 ---- 作业控制 正在执行的一个或者多个程序可形成一个作业。使用管道命令和重定向命令,一个作业可以启动多个进程...

33960
来自专栏IT派

Python爬虫之基本原理

网络爬虫(Web crawler),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,它们被广泛用于互联网搜索引擎或其他类似网站,可以自动采集所有其能够...

11530

扫码关注云+社区

领取腾讯云代金券