NFramework开源AOP框架设计文档

来源:岁月联盟 编辑:zhu 时间:2006-05-24

NFramework开源AOP框架设计文档

1.1       ITransaction接口

用于事务控制的接口,接口方法如下表:

方法名称方法说明BeginTransaction(+2次重载)开始事务CommitTransaction递交事务RollbackTransaction回滚事务

1.2       IDBUtil接口

用于数据库访问的接口。通过工厂方法创建该接口的实例,实现动态数据库的调用。IDBUtil变相的实现了ADO.NET的IDbCommand接口,因此只要您熟悉IDbCommand接口方法,您就可以很容易的使用实现了IDBUtil接口的方法,具体方法如下表:

方法名称方法说明ExecuteNonQuery(+4次重载)对连接执行 Transact-SQL 语句并返回受影响的行数ExecuteScalar(+2次重载)执行查询,并返回查询所返回的结果集中第一行的第一列。忽略额外的列或行。GetDataTable(+4次重载)获取数据集

1.3       AccessDBUtil类

用于访问Access数据库的类。AccessDBUtil类继承了ITransaction、IDBUtil接口,因此当根据数据库类型实例化ITransaction或IDBUtil接口时,实际上实例化本类,从而封装客户代码对不同数据库的访问功能。AccessDBUtil类的具体方法如下表:

方法名称方法说明BeginTransaction(+2次重载)开始事务CommitTransaction递交事务RollbackTransaction回滚事务ExecuteNonQuery(+4次重载)对连接执行 Transact-SQL 语句并返回受影响的行数ExecuteScalar(+2次重载)执行查询,并返回查询所返回的结果集中第一行的第一列。忽略额外的列或行。GetDataTable(+4次重载)获取数据集

1.4       SqlServerDBUtil类

用于访问Sql Server数据库的类。同AccessDBUtil类。

方法名称方法说明BeginTransaction(+2次重载)开始事务CommitTransaction递交事务RollbackTransaction回滚事务ExecuteNonQuery(+4次重载)对连接执行 Transact-SQL 语句并返回受影响的行数ExecuteScalar(+2次重载)执行查询,并返回查询所返回的结果集中第一行的第一列。忽略额外的列或行。GetDataTable(+4次重载)获取数据集

1.5       OracleDBUtil类

用于访问Oracle数据库的类。同AccessDBUtil类。

方法名称方法说明BeginTransaction(+2次重载)开始事务CommitTransaction递交事务RollbackTransaction回滚事务ExecuteNonQuery(+4次重载)对连接执行 Transact-SQL 语句并返回受影响的行数ExecuteScalar(+2次重载)执行查询,并返回查询所返回的结果集中第一行的第一列。忽略额外的列或行。GetDataTable(+4次重载)获取数据集

1.6       Connector类

Connector类采用单件模式创建,用于从Web.Config文件中获取数据库的连接信息。

方法/属性名称方法/属性说明GetInstance方法取得单件实例DataBaseType属性数据库类型DataBaseConnection属性数据库连接字符串

       具体配置信息如下:<appSettings>       <!--数据库连接字符串-->      <add key="DBConnection" value="" />      <!--数据库可选类型:Sql,Oracle,Access-->      <add key="DBType" value="Access" />    </appSettings>

1.7       Factory类

用于实现工厂方法的类。通过Factory类获取ITransaction、IDBUtil接口的实例,从而实现对不同数据库的封装。

方法名称方法说明GetInstance(+2次重载)取得工厂实例

1.8       Transaction类

用于提供事务的类。具体方法如下表:

方法/属性名称方法/属性说明BeginTransaction方法开始事务CommitTransaction方法递交事务RollbackTransaction方法回滚事务

 Transaction类用于方便、灵活的控制同一业务层方法内的事务,如需在不同业务层之间、不同方法之间控制事务,请使用TransactionScope类。

1.9       TransactionScope类

用于提供事务的基类。具体方法如下表:

方法/属性名称方法/属性说明BeginTransaction方法开始事务CommitTransaction方法递交事务RollbackTransaction方法回滚事务SynchronizeTransaction方法同步事务IsSuppressed属性指示是否临时挂起事务,挂起的事务不会执行Commit、Rollback方法

 TransactionScope类是框架的重要类之一,用于提供对事务的支持。用户的业务逻辑层代码只需继承此类就可以实现自动事务的功能。SynchronizeTransaction方法用于同步不同业务层的事务。举例来说:A业务用于更新库存,其有自己的事务。B业务用于记录日志,也有自己独立的事务。但当A调用B时,就要保证A和B共用同一事务,此时就用到了本方法,其实质也就是传递了一个ITransaction类型的参数。另外,如果同一个BLL层的事务有如下情况,比如说:方法A调用了方法B,A有事务控制,B也有事务控制,那么也要保证A与B使用同一个事务,此时就用到了IsSuppressed属性,将IsSuppressed属性设置为真,则不会执行递交事务,回滚事务方法,当需要执行事务时,再将其值设置为假即可。因此,从上面的说明可以看出,SynchronizeTransaction与IsSuppressed都是用于做事务控制的,而二者的区别是前者用于不同BLL层同步事务的处理,而后者用于同一BLL层内不同方法间的同步事务处理。 l         SynchronizeTransaction方法的示例代码如下:    /// <summary>    /// 用于库存调整的业务逻辑类    /// 继承于TransactionScope类,以提供事务的控制    /// </summary>    public class StockAdjustBLL : TransactionScope    {        /// <summary>        /// 新建库存调整单        /// </summary>        /// <returns>生成的主键ID</returns>        public string Insert()        {            // DAL层数据库访问方法类            StockAdjustDAL dal = new StockAdjustDAL();                        try            {                // 调用DBTransaction 类的BeginTransaction方法启动事务                ITransaction trans = this.BeginTransaction();                // 将事务参数赋予数据访问层                dal.SynchronizeTransaction(trans);               // 注意:第一个访问事务                StockAdjustEntity stockadjust = new StockAdjustEntity();                // 插入库存调整表数据                dal.InsertEntity(stockadjust); // 注意:第二个访问事务                StockEntity stock = new StockEntity();                StockBLL stockBll = new StockBLL();                // 重要方法,保证在不同的BLL层在同一事务内运行                stockBll.SynchronizeTransaction(trans);                // 更新库存                stockBll.Update(stock);                 // 注意:第三个访问事务                // 写库存操作日志                StockLogEntity log = new StockLogEntity();                StockLogBLL logBll = new StockLogBLL();                // 重要方法,保证在不同的BLL层在同一事务内运行                logBll.SynchronizeTransaction(trans);                // 写库存操作日志                logBll.Insert(log);                                // 最后递交事务                this.CommitTransaction();            }            catch (Exception ex)            {                // 出错时回滚事务                this.RollbackTransaction();                ErrorHandler.HandleError(ex);            }            // 返回主键ID            return stockadjust.StockAdjustID;        }    l         IsSuppressed方法的示例代码同时下面的这个示例也说明了不同BLL层,相同BLL层事务处理的方法。         /// <summary>        /// 审批采购单        /// 1=未审批,2=审批通过,3=审批未通过,4=部分审批通过        /// </summary>        /// <param name="purchaseID">采购单ID</param>        public void Approve(string purchaseID)        {            PurchaseDAL dal = new PurchaseDAL();            PurchaseEntity purchase;            try            {                ITransaction trans = this.BeginTransaction();                // 重要方法,保证在同一事务内运行                dal.SynchronizeTransaction(trans);                 // 由于在本类中GetEntity方法也使用了事务// 所以此处要挂起GetEntity事务的执行                this.IsSuppressed = true;                // 获取采购信息,此操作会自动使用当前事务                purchase = GetEntity(purchaseID);                 purchase.PurchaseID = purchaseID;                purchase.Status = "2";                purchase.ApproveID = WebBasePage.GetCurrentSession().UserID;                purchase.ApproveDate = DateTime.Now;                dal.UpdateEntity(purchase);                 // 审批同意后更新库存                StockEntity stock = null;                StockEntities stocks;                StockBLL stockBll = new StockBLL();                // 重要方法,保证在同一事务内运行                stockBll.SynchronizeTransaction(trans);                 // 根据product和type信息获取库存信息以便于记录日志                QueryEntity query = new QueryEntity();                query.BuildQueryWhere("Product", CompareTypeEnum.Equal, purchase.ProductID, LogicTypeEnum.And);                query.BuildQueryWhere("TypeID", CompareTypeEnum.Equal, purchase.StockTypeID, LogicTypeEnum.And);                                stocks = stockBll.GetEntities(query);                if (stocks.Count <= 0)                {                    stock = new StockEntity();                    stock.ProductID = purchase.ProductID;                    stock.StockTypeID = purchase.StockTypeID;                    stock.StockNum = purchase.PurchaseNum;                    stock.KeepNum = 0;                    stock.WayNum = 0;                    stock.SafeNum = 0;                    stock.UserID = purchase.ApproveID;                    stock.OperateTime = purchase.ApproveDate;                    stockBll.Insert(stock);                 }                else if (stocks.Count > 1)                {                    // 抛出业务逻辑异常                    ErrorHandler.ThrowBusinessError("库存中多个同种产品,请检查!");                }                else                {                    stock = stocks.GetItem(0);                    stock.StockNum = stock.StockNum + purchase.PurchaseNum;                    stockBll.Update(stock);                 }                                // 写库存操作日志                StockLogEntity log = new StockLogEntity();                StockLogBLL logBll = new StockLogBLL();                // 重要方法,保证在同一事务内运行                logBll.SynchronizeTransaction(trans);                 log.ProductID = purchase.ProductID;                log.StockTypeID = purchase.StockTypeID;                log.StockOptNum = purchase.PurchaseNum;                log.KeepOptNum = 0;                log.WayOptNum = 0;                log.StockNum = stock.StockNum;                log.KeepNum = stock.KeepNum;                log.WayNum = stock.WayNum;                log.Remark = "采购";                log.ObjNO = purchaseID;                log.OperateTime = DateTime.Now;                log.UserID = purchase.ApproveID;                logBll.Insert(log);                 // 恢复事务的执行                this.IsSuppressed = false;                this.CommitTransaction();            }            catch (Exception ex)            {                this.RollbackTransaction();                ErrorHandler.HandleError(ex);            }        }

1.10   TransactionService类

用于提供COM+事务的基类。

方法名称方法说明CompleteTx递交事务AbortTx回滚事务

 TransactionService类是框架的重要类之一,用于提供对分布式事务的支持。由于本功能实际上是使用了COM+提供的事务控制功能,因此必须将使用此类的程序集部署到COM+运行环境中。配置COM+应用的方法如下:               1. 使用sn.exe工具为程序集生成强名称        2. 将强名称程序集部署到全局程序集缓存           gacutil -nologo -i MyAssemble.dll        3. 将强名称程序集部署到COM+中           regsvcs -nologo MyAssemble.dll                   从COM+中卸载的例子:        1. 先从COM+中卸载           regsvcs -nologo -u MyAssemble.dll        2. 从全局程序集缓存中卸载           gacutil -nologo -u MyAssemble.dll 关于COM+的具体信息,请参见MSDN。

1.11   Access类

实际的数据访问基类,用户的DAL层要从此类继承。

方法名称方法说明GetDBUtil获取指定数据库访问对象SynchronizeTransaction同步事务GetGuid获取GUIDGetEntity获取实体GetEntitiesCount获取实体个数GetEntities获取实体集InsertEntity新增UpdateEntity更新DeleteEntity删除GetSequence获取序列值(目前只针对Oracle)

1.12   SqlBuilder类

用于根据实体生成SQL语句的类。框架的重要类之一。

方法名称方法说明BuildCondiction获取完整的条件语句(where、group、order)BuildSqlWhere生成WHERE条件语句BuildSqlGroup生成Sql分组语句BuildSqlOrder生成Sql排序语句BuildSqlSelect生成SELECT语句BuildSqlInsert生成Insert语句,忽略实体中的null值字段BuildSqlUpdate生成Update语句,忽略实体中的null值字段BuildSqlDelete生成DELETE语句,忽略实体中的null值字段BuildParameters生成参数实体,忽略实体中的null值字段BuildParamsSqlInsert生成参数化的Insert语句,忽略实体中的null值字段BuildParamsSqlUpdate生成参数化的Update语句,忽略实体中的null值字段PreHandleComma处理单引号的问题PreHandleSql预处理Sql语句,主要处理了LIKE条件的保留字符,如:%、_、[、^

1.13   BaseEntities类

所有实体集合类的基类,提供了序列化、索引器,枚举器、DataTable转换功能。

方法名称方法说明ConvertTo将实体集合转换成DataTable形式ConvertFrom通过实体映射的字段名将DataTable值解析成实体集合Parse通过实体映射的属性名将DataTable值解析成实体集合GetItem通过索引获取SetItem设置实体Add增加Remove通过索引移除Clear全部移除Count获取个数

1.14   BaseEntity类

所有实体类的基类,提供获取实体O/R Mapping相关信息、DataTable转换功能。

方法名称方法说明ConvertTo将实体集合转换成DataTable形式ConvertFrom通过实体映射的字段名将DataTable值解析成实体集合Parse通过实体映射的属性名将DataTable值解析成实体集合GetTableName(+2次重载)获取实体映射的表名GetPropertyName获取数据库字段名对应的属性名,如果找不到对应的属性名则返回传入的字段名GetPropertyNames获取实体的所有属性名的数组形式GetFieldName获取实体映射的字段名,如果找不到对应的字段名则返回传入的属性名GetFieldNames获取实体映射的字段名所有字段名的数组形式GetPropertyValue获取实体的属性值,如果指定的属性名不存在则返回nullGetDataType获取实体映射的数据类型,如果指定的属性名不存在则使用字段名再次进行查询,如果还不存在,则返回DataTypeEnum.Default,建议使用属性名进行获取以符合O/R Mappgin的思想IsPK获取实体映射的字段是否是主键,如果指定的属性名不存在则返回falseIsSelected获取实体映射的字段是否可以Select,如果指定的属性名不存在则返回falseIsInserted获取实体映射的字段是否可以Insert,如果指定的属性名不存在则返回falseIsUpdated获取实体映射的字段是否可以Update,如果指定的属性名不存在则返回false

1.15   QueryEntities类

用于查询的实体集合类,即容器类。此类支持索引器、枚举器功能。

方法名称方法说明GetItem通过索引获取SetItem设置实体Add增加Remove通过索引移除Clear全部移除Count获取个数

1.16   QueryEntity类

用于查询的实体类。QueryEntity类在传递查询条件时十分有用,可以自动生成相对应的SQL条件语句,并且在参数类型方面也可以根据实体映射自动识别参数类型,长度等信息。QueryEntity类主要属性如下表:

属性名称属性说明PageIndex要查询的页数PageSize查询页显示的记录数RecordCount总记录数WhereEntities过滤条件GroupEntities分组条件OrderEntities排序条件

1.17   QueryWhereEntities类

查询条件容器类,功能同QueryEntities类。

1.18   QueryWhereEntity类

查询条件实体类。具体属性如下表:

属性名称属性说明CompareType比较操作符LogicType逻辑操作符BracketType括号类型FieldName字段名,可以属性名,也可以实际的数据表字段名,在生成条件时会自动进行匹配DataType字段类型,对于没有进行O/R Mapping设置的实体类,必须指定实际的类型FieldValue字段值

1.19   QueryGroupEntities类

分组条件容器类,功能同QueryEntities类。

1.20   QueryGroupEntity类

分组条件实体类。具体属性如下表:

属性名称属性说明FieldName字段名,可以属性名,也可以实际的数据表字段名,在生成条件时会自动进行匹配

1.21   QueryOrderEntities类

排序条件容器类,功能同QueryEntities类。

1.22   QueryOrderEntity类

排序条件实体类。具体属性如下表:

属性名称属性说明FieldName字段名,可以属性名,也可以实际的数据表字段名,在生成条件时会自动进行匹配OrderType排序方式

1.23   ParameterEntities类

参数实体容器类,功能同QueryEntities类。

1.24   ParameterEntity类

参数实体类。具体属性如下表:

属性名称属性说明ParameterName参数名,可以属性名,也可以实际的数据表字段名,在生成参数时会自动进行匹配ParameterValue参数值ParameterType对于没有进行O/R Mapping设置的实体类,必须指定实际的类型ParameterDirection参数方向,可以是输入参数、输入输出参数、输出参数、返回值参数

1.25   Error类

自定义异常类,继承于ApplicationException。用于扩展异常信息。

属性名称属性说明ErrorID异常IDErrorType异常类型MachineName异常所在机器名ErrorTime异常发成时间SqlCommand引发异常的SQL语句UserID引发异常的用户IDVisitPage引发异常的页面Description自定义的异常详细描述信息

1.26   ErrorHandler类

用于显示的处理的自定义异常的类。

方法名称方法说明HandleError处理异常,并根据配置信息决定是否记录日志ThrowBusinessError抛出业务逻辑异常ThrowTechError抛出技术异常

1.27   Logger类

日志处理类。配置信息如下:        <!--是否记录日志-->         <add key="LogEnabled" value="true|false" />        <!--日志文件名称及位置-->           <add key="LogFile" value="c://log.txt" />        <!--日志文件的最大尺寸-->           <add key="LogMaxSize" value="10M" />        <!--是否在页面上显示详细的日志信息-->           <add key="ShowErrors" value="true|false" /> 

方法名称方法说明WriteLog记录日志

1.28   ORMapingAttribute类

O/R Mapping实现类,框架的重要类之一。属性如下表:

属性名称属性说明TableName表名FieldName字段名IsPK是否是主键IsSelectedSelect时是否包含IsInsertedInsert时是否包含IsUpdatedUpdate时是否包含RelationName表之间的关联信息,可以是join关联,也可是子查询关联

1.29   WebBasePage类

Web页面基类,提供Session控制、权限检测、错误处理等常用功能。

方法名称方法说明GetCurrentSession获取当前会话对象IsLogin判断是否已登录LogOut注销OnLoad重载登录方法,用于判断是否已登录OnError重载出错时的处理方法,以支持统一的异常处理方式、日志记录方式MessageBox(+3次重载)显示具有指定文本的消息框GetAppPath获取当前WEB应用程序的绝对路径GetCurrentPage获取当前访问的页面OneClickButton(+1次重载)使得服务端Button在一次Postback中只能点击一次

1.30   WebSession类

会话对象实体类,属性说明如下表:

属性名称属性说明WebSessionID会话IDUserID用户IDUserName用户姓名LoginName用户登录名OrganID组织IDOrganName组织名称DeptID部门IDDeptName部门名称RoleID角色IDRoleName角色名称CountryCode国家代码LanguageCode语言代码

1.31   WinBaseForm类

1.32   WinSession类