操作日志设计--续
通了解《系统操作日志设计》,已基本明确我们不能通过clone的方式来做日志的设计,因为这样不仅会造成的你数据库表爆炸的情况,还大大的增加了工作量,减少了系统的可维护性。
????? 通过思考大概清楚系统操作日志的设计,以下是其UML图:

?
通过上图,我们可以了解知道该UML主要由三个表组成,其中一个主表LogSetting和两个从表分别是LogOperation和LogSettingDetail。
那么怎么样才能通过这样的设计来现实我们的日志功能呢?
其实一开始我就觉得通过.net的反射功能可以很简单、很方便的实现这个功能,所以我就顺着一个思路来实现她;通过反射动态的获取Model实体的属性,然后再根据LogSettingDetail配置来匹配所要记录的字段信息。
?
先来主要的代码吧,发现将思想用文字表达出来还是较困难的,代码比较直接:
使用的场景
Model文件:
string Name{get;set;}…}下面介绍如何将系统操作日志集成到你的业务系统中添加操作:EmployeeBll bll = new EmployeeBll();EmployeeModel model = new EmployeeModel();/* model 实体经过漫长的 赋值 后… */bll.Add(model); //添加实体//添加系统操作记录//日志LogManager<EmployeeModel> log = new LogManager<EmployeeModel>();log.Add(model);?更新操作:EmployeeBll bll = new EmployeeBll();EmployeeModel model = bll.GetModel(employeeID);LogManager<EmployeeModel> log = new LogManager<EmployeeModel>();EmployeeModel modelOld = log.Clone(model); //克隆EmployeeModel实体对象,这个主要是在系统操作日志记录时使用的?/* model 实体又经过漫长的 赋值 后… */bll.Update(model); //更新实体//将更新的内容写入系统操作日志中log.Compare(modelOld, model); //原来的实体和赋值后的实体对比,并将更新的内容写入系统操作日志中?删除操作:在GridView的RowDeleting事件中获取要删除的实体EmployeeBll bll = new EmployeeBll();EmployeeModel model = bll.GetModel(employeeID);bll.Delete(employeeID);LogManager<EmployeeModel> log = new LogManager<EmployeeModel>();log.Delete(model); //实体的内容记录到日志中??
总结:
大家可以看到代码还是比较粗糙的,有不少的重复的代码,下一节将会讨论如何进行系统操作日志管理。
另外如何大家有什么意见或想法请分享提出。
?
本节用到的知识点:
1、泛型
2、反射
3、缓存
?
优点:
1、使用和集成方便,代码量小;
2、大大提高工作效率,避免表爆炸;
?