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

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

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

 在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开发的“用不到事件”,其实,可能是我们不太了解事件,在以后的学习中,我还会去写“事件有道”这个系列。

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

时间: 2024-09-20 23:19:50

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

java 日历中用户创建一个跨天的事件提醒,那么我的java日历应当如何去记录并打印出这样的事件呢?

问题描述 java 日历中用户创建一个跨天的事件提醒,那么我的java日历应当如何去记录并打印出这样的事件呢? 一个班级假如有100个同学,现在我们按照学号随机选择连续学号的42名同学,这42名同学一排7人分为6排,然后按照他们这一年来参加活动的多少来给分,规定一个同学参加一次班级活动就给这位同学1分,参加一次团体表演(你可以认为参加团体表演的人都是按照学号顺序相邻的,比如从1到10号的同学,他们一块进行了一场团体表演,学号15-30的16位同学一块进行了一次团体表演等,这些人每人都能获得1分)

如何在Liberty服务器发生故障时进行故障恢复

可以利用 IBM HTTP 服务器机器插件在前端作http://www.aliyun.com/zixun/aggregation/13996.html">负载均衡,将请求分发给多个 Liberty 服务器.Liberty 服务器上的应用可以将应用会话信息保存在数据库中,被多个 Liberty 服务器共享.当某个 Liberty 服务器发生故障时,可用的其他 Liberty 服务器会将故障 Liberty 服务器存在会话数据库中的会话信息接管过来,继续处理,保持服务的持续可用.本文将向您介绍

拦截PHP各种异常和错误,发生致命错误时进行报警,万事防患于未然

原文:拦截PHP各种异常和错误,发生致命错误时进行报警,万事防患于未然 在日常开发中,大多数人的做法是在开发环境时开启调试模式,在产品环境关闭调试模式.在开发的时候可以查看各种错误.异常,但是在线上就把错误显示的关闭. 上面的情形看似很科学,有人解释为这样很安全,别人看不到错误,以免泄露重要信息... 但是你有没有遇到这种情况,线下好好的,一上线却运行不起来也找不到原因... 一个脚本,跑了好长一段时间,一直没有问题,有一天突然中断了,然后了也没有任何记录都不造啥原因... 线上一个付款,别人明

vb net-VB.NET能自己定义一个事件,比如一个变量等于一个特定值时引发一个事件的触发吗?

问题描述 VB.NET能自己定义一个事件,比如一个变量等于一个特定值时引发一个事件的触发吗? VB.NET能自己定义一个事件,比如一个变量等于一个特定值时引发一个事件的触发吗? 比如定义一个变量i 当i=1时触发一个事件 解决方案 自己定义一个方法把i封装起来,要改变i需要通过这个方法修改 比如 public sub modifyI(byval i1 as integer) i = i1 '触发事件 end sub 或者 用定时器的方式 Public class Form1 Public y_c

请问这个实体的注解写的有问题吗,为什么不能建表

问题描述 请问这个实体的注解写的有问题吗,为什么不能建表 import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity(name="readdress") public class ReAddress{ @Id @GeneratedValue(st

加载实体数据模型工具包时出错,无法加载实体数据模型工具包

问题描述 新建ADO.NET实体数据模型失败,报错:加载实体数据模型工具包时出错,无法加载实体数据模型工具包:已经尝试过:1.重装VS20102.devenv/resetskippkgs3.重装X:WCUEfools和DAC,其中DAC安装失败,因为我已经安装了SQL20084.删除了%localappdata%microsoftvisualstudio10.0和C:Users<user>appdataRoamingMicrosoftVisualStudio10.0和C:ProgramData

phpmyadmin-“无法在发生错误时创建会话”解决办法

当登录 phpMyAdmin 出现错误提示"无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装.".原因是退出phpMyAdmin的时候,没有点"退出"而退出,而是直接叉掉浏览器窗口,当再次登录phpMyAdmin的时候就会出现这个错误.如下图: 解决办法如下: 进入 C:\ZkeysSoft\Php\tmp 文件夹,将里面的内容都删除掉即可恢复正常. 再次登录phpMyAdmin,即可进入.下次退出phpMyAdmin的时候一定要

phpMyAdmin错误-无法在发生错误时创建会话...

当登录 phpMyAdmin 出现错误提示"无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装.".原因是退出phpMyAdmin的时候,没有点"退出"而退出,而是直接叉掉浏览器窗口,当再次登录phpMyAdmin的时候就会出现这个错误. 如果服务器是用的wdcp管理软件的话,直接SSH登录服务器,进入: /www/wdlinux/tmp 把里面的sess开头的文件全部删除. 如果是其他系统就进入 PHP安装目录/tmp 删除ses

无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装最快的解决办法_php技巧

有时候用phpMyAdmin的时候会突然出现这个错误信息 "无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装" 也不知道到底是怎么导致这错误信息的,而我有时候把apache重启一下,再登录就行了,有时候把机器重启也可以 但今天2种方法都试了,还是不行,我的登录URL是 http://computer-name:8080 然后我尝试着使用 http://127.0.0.1:8080 进行登录,结果就可以了... 使用127.0.0.1登录成功后,退出,