事件之道~一 如何让实体发生更新时,同时记录它更新的内容到日志表
2012-06-01 17:19
411 查看
一 如何让实体发生更新时,同时记录它更新的内容到日志表
在日常生活中,有个订阅的事,如,订个报纸,当出版社出版后,报纸就会送到您家,你不用管它什么时候出版。在OA系统或者后台管理系统中,修改一条记录,总是想把它记住,等数据出问题后,好有据可查。
如何去实现这样的效果呢,难道为每一个方法都写一个insertLog(log)方法吗?这也太不面向对象了吧,呵呵,做为一个懒型程序员,不会这样做的,呵呵。
像这样:
Log log=new Log{...}; product.Update(entity); logRepository.insertLog(log); Log log=new Log{...}; user.Update(entity); logRepository.insertLog(log);
这样的程序没有任何可扩展性和复用性,可能有些人会把程序改成这样,即针insertlogs写在update方法里
this.update(entity); logRepository.insertLog(entity.Log);
这样的问题是什么呢?不够灵活,这时,只要调用update方法,都将会插入日志记录,有时,我们可能不想记录日志,这时怎么办呢?不会还要让我再一个update方法吧
解决这种问题,就是事件机制,首先让希望插入日志的对象去订阅插日志的事件,然后在统一的update方法里去触发它,这样,谁订阅了这个事件,就去为谁服务,不是很好,呵呵。
以下是统一实体类EntityBase的代码:
1 public EntityBase Log { get; set; } #region Events 一组实体修改相关事件 /// <summary> /// 修改前 /// </summary> public event Action ModifyBefore; /// <summary> /// 修改后 /// </summary> public event Action<EntityBase> ModifyAfter; #endregion #region Public Methods 触发实体修改事件的方法 public void OnModifyBefore() { if (ModifyBefore != null) this.ModifyBefore(); } public void OnModifyAfter(EntityBase log) { if (ModifyAfter != null) this.ModifyAfter(log); } #endregion
RepositoryBase类相关代码完成对日志的插入:
#region System Logs /// <summary> /// 插入日志 /// </summary> /// <param name="log"></param> public void InsertLog(EntityBase log) { //写日志DB.Insert(log); if (log != null) this.InsertEntity(log); } #endregion
在更新方法中进行事件的触发:
try { entity.OnModifyBefore(); //为更新注入记录日志的事件 DB.ExecuteCommand(builder.ToString(), arguments.ToArray()); entity.OnModifyAfter(entity.Log); } catch (Exception ex) { Debug.WriteLine(ex); throw; }
在前台调用时,就变成了这样:
1 entity.ModifyBefore += delegate { entity.Log = new WebEntityLogs { CreateDate = DateTime.Now, Info = entity.Name, Operator = "zzl", Title = "帮助中心" }; }; entity.ModifyAfter += new HelperCenterCategoryRepository().InsertLog; iHelperCenterCategoryRepository.Update(entity);
这样,当iHelperCenterCategoryRepository方法成功操作后,就会触发InsertLog这个方法,来将Logs记录插入。
事实上,有时我们总是说“事件用不到”,做WEB开发的“用不到事件”,其实,可能是我们不太了解事件,在以后的学习中,我还会去写“事件有道”这个系列。
相关文章推荐
- 如何在窗口创建的同时更新List控件内容,在编程过程中遇到的问题
- 利用Laravel事件系统如何实现登录日志的记录详解
- apache 访问日志如何设置每日新增一个日志文件、如何限制大小、设置记录内容
- Python脚本实现值更新事件赋值过程记录日志监控
- 如何在事件查看器中记录有关磁盘配额的相关内容
- 喜迎下一个挑战WebRTC, 博客的内容会更新的慢一些, 当然还是会持续记录下去的:)
- Android如何处理列表控件的item同时点击事件
- Tomcat会话超时时如何记录操作日志,满足安全审计要求
- Windows 7系统想要查看事件日志时候要如何查看
- 灵异事件记录!---iBatis实体更改
- 如何记录文件服务器上的文件操作日志
- EventLog控件记录事件日志
- 监听input text中内容发生变化时触发事件
- 如何查看mysql运行、访问记录等日志
- 如何将WordPress日志更新和Windows Live Messenger连接起来
- Jquery 网页内容更新后的事件绑定
- EXCEL增加审计功能,记录每个单元格的修改日志(支持记录多个单元格同时修改时记录审计信息)
- 如何实现 Nginx 代理的节点访问日志记录客户的 IP 而不是代理的 IP?
- Flex中如何利用getTextField事件和numLines属性,计算出TextArea控件中内容的行数的例子
- Python如何记录日志