事件之道~一 如何让实体发生更新时,同时记录它更新的内容到日志表

简介:

一 如何让实体发生更新时,同时记录它更新的内容到日志表

 在日常生活中,有个订阅的事,如,订个报纸,当出版社出版后,报纸就会送到您家,你不用管它什么时候出版。

 在OA系统或者后台管理系统中,修改一条记录,总是想把它记住,等数据出问题后,好有据可查。

如何去实现这样的效果呢,难道为每一个方法都写一个insertLog(log)方法吗?这也太不面向对象了吧,呵呵,做为一个懒型程序员,不会这样做的,呵呵。

像这样:

1 Log log=new Log{...};
2 product.Update(entity);
3 logRepository.insertLog(log);
4 
5 Log log=new Log{...};
6 user.Update(entity);
7 logRepository.insertLog(log);

这样的程序没有任何可扩展性和复用性,可能有些人会把程序改成这样,即针insertlogs写在update方法里

1 this.update(entity);
2 logRepository.insertLog(entity.Log);

这样的问题是什么呢?不够灵活,这时,只要调用update方法,都将会插入日志记录,有时,我们可能不想记录日志,这时怎么办呢?不会还要让我再一个update方法吧

解决这种问题,就是事件机制,首先让希望插入日志的对象去订阅插日志的事件,然后在统一的update方法里去触发它,这样,谁订阅了这个事件,就去为谁服务,不是很好,呵呵。

以下是统一实体类EntityBase的代码:

 1    public EntityBase Log { get; set; }     
 2    #region Events 一组实体修改相关事件
 3         /// <summary>
 4         /// 修改前
 5         /// </summary>
 6         public event Action ModifyBefore;
 7         /// <summary>
 8         /// 修改后
 9         /// </summary>
10         public event Action<EntityBase> ModifyAfter;
11         #endregion
12 
13         #region Public Methods 触发实体修改事件的方法
14         public void OnModifyBefore()
15         {
16             if (ModifyBefore != null)
17                 this.ModifyBefore();
18         }
19 
20         public void OnModifyAfter(EntityBase log)
21         {
22             if (ModifyAfter != null)
23                 this.ModifyAfter(log);
24         }
25         #endregion

RepositoryBase类相关代码完成对日志的插入:

 1  #region System Logs
 2         /// <summary>
 3         /// 插入日志
 4         /// </summary>
 5         /// <param name="log"></param>
 6         public void InsertLog(EntityBase log)
 7         {
 8             //写日志DB.Insert(log);
 9             if (log != null)
10                 this.InsertEntity(log);
11         }
12 #endregion

在更新方法中进行事件的触发:

 1             try
 2             {
 3                 entity.OnModifyBefore(); //为更新注入记录日志的事件
 4                 DB.ExecuteCommand(builder.ToString(), arguments.ToArray());
 5                 entity.OnModifyAfter(entity.Log);
 6             }
 7             catch (Exception ex)
 8             {
 9                 Debug.WriteLine(ex);
10                 throw;
11             }

在前台调用时,就变成了这样:

 1                entity.ModifyBefore += delegate
 2                 {
 3                     entity.Log = new WebEntityLogs
 4                     {
 5                         CreateDate = DateTime.Now,
 6                         Info = entity.Name,
 7                         Operator = "zzl",
 8                         Title = "帮助中心"
 9                     };
10                 };
11                 entity.ModifyAfter += new HelperCenterCategoryRepository().InsertLog;
12                 iHelperCenterCategoryRepository.Update(entity);

这样,当iHelperCenterCategoryRepository方法成功操作后,就会触发InsertLog这个方法,来将Logs记录插入。

事实上,有时我们总是说“事件用不到”,做WEB开发的“用不到事件”,其实,可能是我们不太了解事件,在以后的学习中,我还会去写“事件有道”这个系列。

本文转自博客园张占岭(仓储大叔)的博客,原文链接:事件之道~一 如何让实体发生更新时,同时记录它更新的内容到日志表,如需转载请自行联系原博主。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
Kubernetes Perl 容器
K8s查看集群 状态事件描述以及Pod日志信息
K8s查看集群 状态事件描述以及Pod日志信息
50 3
|
5月前
|
前端开发 Java 调度
XXL-JOB 日志表和日志文件自动清理
XXL-JOB 日志表和日志文件自动清理
|
2月前
|
存储 SQL Serverless
Serverless 应用引擎常见问题之应用下的【应用事件】以及企业级特性下的【事件中心】没有日志如何解决
Serverless 应用引擎(Serverless Application Engine, SAE)是一种完全托管的应用平台,它允许开发者无需管理服务器即可构建和部署应用。以下是Serverless 应用引擎使用过程中的一些常见问题及其答案的汇总:
34 0
|
3月前
|
关系型数据库 MySQL 数据库
MySQL员工打卡日志表——数据库练习
MySQL员工打卡日志表——数据库练习
137 0
|
4月前
|
存储 JSON 运维
【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)
【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)
54 0
|
5月前
|
缓存 关系型数据库 MySQL
这个错误提示表明Flink CDC在解析MySQL的二进制日志时,找不到对应表的TableMap事件。
这个错误提示表明Flink CDC在解析MySQL的二进制日志时,找不到对应表的TableMap事件。
148 2
|
8月前
|
运维 监控 算法
事件日志分析算法:提升上网行为管理软件的智能监控
随着互联网的快速发展,网络安全和上网行为管理变得越来越重要了。不少企业和组织为了维护网络的安全、稳定性,还有员工的工作效率,都开始使用上网行为管理软件。这些软件的作用就是监控、分析和控制员工的上网行为,帮助组织管理网络资源,以免潜在的网络威胁和数据泄漏。其中,事件日志分析算法发挥了关键作用,它们有各种各样的优点和用途,真的非常实用。接下来,就让我们来看看,事件日志分析算法在这方面有哪些厉害的地方以及怎么用吧!
162 0
|
11月前
|
监控 Java Spring
spring通过监听事件记录系统日志
spring通过监听事件记录系统日志
|
12月前
|
Oracle 前端开发 关系型数据库
log file sync 和 log file parallel write等待事件的区别和联系
log file parallel write 和log file sync这两个等待事件关系密切,很多人对这两个等待事件有一些误解,我们先来看看Oracle官方文档的解释:
|
Python
Python3,好看的外(shen)表(cai)千篇一律,炫彩的日志万里挑一。
这下好了, 只根据输出的日志颜色, 就会判断等级缺陷了。
23968 1
Python3,好看的外(shen)表(cai)千篇一律,炫彩的日志万里挑一。