Winform开发框架之权限管理系统改进的经验总结(4)2014-03-26 伍华聪 一行代码实现表操作日志记录在前面介绍了几篇关于我的权限系统改进的一些经验总结,本篇继续这一系列主体,介绍如何一行代 码实现重要表的操作日志记录。我们知道,在很多业务系统里面,数据是很敏感的,特别对于一些增加 、修改、删除等关键的操作,如果能在框架层面的支持基础上,以最少的代码实现重要表的日志记录, 那么是一件非常值得庆贺的事情,也能够为我们客户的数据提供重要的日志跟踪,甚至是数据恢复的参 考。1、数据访问层的对象继承关系首先,为了减少重复代码的编写,合理的继承关系是必要的,我们需要在数据访问层上建立合理的继 承关系,如下是我的Winform开发框架的继承关系。每个数据访问对象(如ItemDetail数据访问对象)都 继承一个抽象基类AbstractBaseDAL和一个IBaseDAL基类接口,同时它也有自己特殊的业务接口,如 IItemDetail,关系如下所示。

有了上面的继承关系,我们就可以把常规的数据库重要操作(增删改)放到一个高一级的层次上去解 决这个问题,而不需要在每个数据访问层的业务类来实现。2、操作日志记录事件的定义和使用为了更好实现数据操作日志的记录,我们以事件方式来触发操作日志的记录,事件的具体记录实现, 可以交给外部来记录处理。如果事件被外部赋值了,那么就可以在底层触发这个事件记录,记录事件的 定义代码在抽象基类进行定义,如下所示。
/// 定义一个记录操作日志的事件处理/// </summary>/// <param name="userId">操作的用户ID</param>/// <param name="tableName">操作表名称</param>/// <param name="operationType">操作类型:增加、修改、删除</param>/// <param name="note">操作的详细记录信息</param>/// <returns></returns>public delegate bool OperationLogEventHandler(string userId, string tableName, string operationType, string note, DbTransaction trans = null); /// <summary>/// 数据访问层的超级基类,所有数据库的数据访问基类都继承自这个超级基类,包括Oracle、SqlServer、Sqlite、MySql、Access等/// </summary>public abstract class AbstractBaseDAL<T> where T : BaseEntity, new(){#region 构造函数protected string dbConfigName = ""; //数据库配置名称protected string parameterPrefix = "@";//数据库参数化访问的占位符protected string safeFieldFormat = "[{0}]";//防止和保留字、关键字同名的字段格式,如[value]protected string tableName;//需要初始化的对象表名protected string primaryKey;//数据库的主键字段名protected string sortField;//排序字段protected bool isDescending = true;//是否为降序protected string selectedFields = " * ";//选择的字段,默认为所有(*)public event OperationLogEventHandler OnOperationLog;//定义一个操作记录的事件处理.....................