事件之道~一 如何让实体发生更新时,同时记录它更新的内容到日志表
一 如何让实体发生更新时,同时记录它更新的内容到日志表
在日常生活中,有个订阅的事,如,订个报纸,当出版社出版后,报纸就会送到您家,你不用管它什么时候出版。
在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开发的“用不到事件”,其实,可能是我们不太了解事件,在以后的学习中,我还会去写“事件有道”这个系列。
分类:
其它 / ASP.NET
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2011-06-01 项目中的通用查询参数类,它体现了项目架构的大局观
2011-06-01 MVC模式中,如何使用AJAX进行分页