当前位置: 首页 > news >正文

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

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

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

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

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

相关文章:

  • 如何在最段的时间内让搜索引擎收录一个新网站?
  • 云上数据安全,初识数据库审计
  • Android 中文API (33) —— Checkable
  • Jexus~mono中使用StackExchange.redis的问题
  • ios开发之--textview意见反馈页面(占位label,字数统计,提交按钮的交互设置)...
  • 谈谈转行
  • [Spark][Python]DataFrame中取出有限个记录的例子
  • ORM规范API通用格式及禁止联表查询方案实现ORM
  • swift基础学习(九)
  • MySQL Workbench关键字转成小写设置
  • iOS-关于autoresizingMask在7.x及以下版本的一个bug
  • XV Open Cup named after E.V. Pankratiev. GP of Three Capitals
  • View 和Activity生命周期
  • Swift 2 0 如何替代 pch
  • 使用阿里云Maven镜像的正确姿势
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • javascript 总结(常用工具类的封装)
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • js算法-归并排序(merge_sort)
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Vue 2.3、2.4 知识点小结
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 分享一份非常强势的Android面试题
  • 力扣(LeetCode)21
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 移动端唤起键盘时取消position:fixed定位
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 再次简单明了总结flex布局,一看就懂...
  • RDS-Mysql 物理备份恢复到本地数据库上
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 组复制官方翻译九、Group Replication Technical Details
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (ibm)Java 语言的 XPath API
  • (LeetCode) T14. Longest Common Prefix
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (十一)c52学习之旅-动态数码管
  • (一)u-boot-nand.bin的下载
  • (原創) 物件導向與老子思想 (OO)
  • (转) Android中ViewStub组件使用
  • (转)JAVA中的堆栈
  • (转)linux 命令大全
  • (转)Linux整合apache和tomcat构建Web服务器
  • **python多态
  • .cfg\.dat\.mak(持续补充)
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET Micro Framework初体验
  • .net 中viewstate的原理和使用