博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
事件之道~一 如何让实体发生更新时,同时记录它更新的内容到日志表
阅读量:7080 次
发布时间:2019-06-28

本文共 2761 字,大约阅读时间需要 9 分钟。

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

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

 在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         ///  4         /// 修改前 5         ///  6         public event Action ModifyBefore; 7         ///  8         /// 修改后 9         /// 10         public event Action
ModifyAfter;11 #endregion12 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         ///  3         /// 插入日志 4         ///  5         ///  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开发的“用不到事件”,其实,可能是我们不太了解事件,在以后的学习中,我还会去写“事件有道”这个系列。

本文转自博客园张占岭(仓储大叔)的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
机器学习到底是什么?
查看>>
phpstorm配置svn
查看>>
用ISAPI Filter设置HttpOnly属性
查看>>
DNS域名服务器
查看>>
springmvc4环境简单搭建和定时任务
查看>>
mybatis-generator扩展教程系列 -- 自定义generatorConfig.xml参数
查看>>
基本的IPX配置
查看>>
稳扎稳打Silverlight(32) - 2.0Tip/Trick之MessageBox, Popup, 循环的几种实现方法, 动态变换主题...
查看>>
SQL Server存储过程输入参数使用表值
查看>>
SQL Injection [ Bypassing WAF (403 Forbidden) ]
查看>>
拇指接龙游戏从WIN32向Android移植过程问题记录(2)
查看>>
开源安全技术的四大好处
查看>>
LoadRunner在移动端性能测试的应用
查看>>
Hello JMX!
查看>>
轻松学习Linux之认识Shell
查看>>
Golang之interface
查看>>
SQL Server T-SQL高级查询
查看>>
Python自省(反射)指南[转]
查看>>
阿里巴巴公布了一份最新的AI成绩单
查看>>
Azure ARM (4) 开始创建ARM Resource Group并创建存储账户
查看>>