NFramework开源AOP框架设计文档
2008-04-10 15:37
253 查看
NFramework开源AOP框架设计文档
1.1 ITransaction接口
用于事务控制的接口,接口方法如下表:
1.2 IDBUtil接口
用于数据库访问的接口。通过工厂方法创建该接口的实例,实现动态数据库的调用。IDBUtil变相的实现了ADO.NET的IDbCommand接口,因此只要您熟悉IDbCommand接口方法,您就可以很容易的使用实现了IDBUtil接口的方法,具体方法如下表:
1.3 AccessDBUtil类
用于访问Access数据库的类。AccessDBUtil类继承了ITransaction、IDBUtil接口,因此当根据数据库类型实例化ITransaction或IDBUtil接口时,实际上实例化本类,从而封装客户代码对不同数据库的访问功能。AccessDBUtil类的具体方法如下表:
1.4 SqlServerDBUtil类
用于访问Sql Server数据库的类。同AccessDBUtil类。
1.5 OracleDBUtil类
用于访问Oracle数据库的类。同AccessDBUtil类。
1.6 Connector类
Connector类采用单件模式创建,用于从Web.Config文件中获取数据库的连接信息。
具体配置信息如下:
[align=left]<appSettings>[/align]
[align=left] [/align]
[align=left] <!--数据库连接字符串-->[/align]
[align=left] <addkey="DBConnection"value=""/>[/align]
[align=left] <!--数据库可选类型:Sql,Oracle,Access-->[/align]
[align=left] <addkey="DBType"value="Access"/>[/align]
[align=left] [/align]
[align=left]</appSettings>[/align]
1.7 Factory类
[align=left]用于实现工厂方法的类。通过Factory类获取ITransaction、IDBUtil接口的实例,从而实现对不同数据库的封装。[/align]
1.8 Transaction类
[align=left]用于提供事务的类。具体方法如下表:[/align]
[align=left] [/align]
[align=left]Transaction类用于方便、灵活的控制同一业务层方法内的事务,如需在不同业务层之间、不同方法之间控制事务,请使用TransactionScope类。[/align]
1.9 TransactionScope类
[align=left]用于提供事务的基类。具体方法如下表:[/align]
TransactionScope类是框架的重要类之一,用于提供对事务的支持。用户的业务逻辑层代码只需继承此类就可以实现自动事务的功能。
SynchronizeTransaction方法用于同步不同业务层的事务。举例来说:A业务用于更新库存,其有自己的事务。B业务用于记录日志,也有自己独立的事务。但当A调用B时,就要保证A和B共用同一事务,此时就用到了本方法,其实质也就是传递了一个ITransaction类型的参数。另外,如果同一个BLL层的事务有如下情况,比如说:方法A调用了方法B,A有事务控制,B也有事务控制,那么也要保证A与B使用同一个事务,此时就用到了IsSuppressed属性,将IsSuppressed属性设置为真,则不会执行递交事务,回滚事务方法,当需要执行事务时,再将其值设置为假即可。因此,从上面的说明可以看出,SynchronizeTransaction与IsSuppressed都是用于做事务控制的,而二者的区别是前者用于不同BLL层同步事务的处理,而后者用于同一BLL层内不同方法间的同步事务处理。
l SynchronizeTransaction方法的示例代码如下:
[align=left] ///<summary>[/align]
[align=left] ///用于库存调整的业务逻辑类[/align]
[align=left] ///继承于TransactionScope类,以提供事务的控制[/align]
[align=left] ///</summary>[/align]
[align=left] public class StockAdjustBLL : TransactionScope[/align]
[align=left] {[/align]
[align=left] ///<summary>[/align]
[align=left] ///新建库存调整单[/align]
[align=left] ///</summary>[/align]
[align=left] ///<returns>生成的主键ID</returns>[/align]
[align=left] public string Insert()[/align]
[align=left] {[/align]
[align=left] // DAL层数据库访问方法类[/align]
[align=left] StockAdjustDAL dal = new StockAdjustDAL();[/align]
[align=left] [/align]
[align=left] try[/align]
[align=left] {[/align]
[align=left] // 调用DBTransaction 类的BeginTransaction方法启动事务[/align]
[align=left] ITransaction trans = this.BeginTransaction();[/align]
[align=left] // 将事务参数赋予数据访问层[/align]
[align=left] dal.SynchronizeTransaction(trans);[/align]
[align=left] [/align]
[align=left] // 注意:第一个访问事务[/align]
[align=left] StockAdjustEntity stockadjust = new StockAdjustEntity();[/align]
[align=left] // 插入库存调整表数据[/align]
[align=left] dal.InsertEntity(stockadjust);[/align]
[align=left] [/align]
[align=left]// 注意:第二个访问事务[/align]
[align=left] StockEntity stock = new StockEntity();[/align]
[align=left] StockBLL stockBll = new StockBLL();[/align]
[align=left] // 重要方法,保证在不同的BLL层在同一事务内运行[/align]
[align=left] stockBll.SynchronizeTransaction(trans);[/align]
[align=left] // 更新库存[/align]
[align=left] stockBll.Update(stock); [/align]
[align=left] [/align]
[align=left]// 注意:第三个访问事务[/align]
[align=left] // 写库存操作日志[/align]
[align=left] StockLogEntity log = new StockLogEntity();[/align]
[align=left] StockLogBLL logBll = new StockLogBLL();[/align]
[align=left] // 重要方法,保证在不同的BLL层在同一事务内运行[/align]
[align=left] logBll.SynchronizeTransaction(trans);[/align]
[align=left] // 写库存操作日志[/align]
[align=left] logBll.Insert(log);[/align]
[align=left] [/align]
[align=left] // 最后递交事务[/align]
[align=left] this.CommitTransaction();[/align]
[align=left] }[/align]
[align=left] catch (Exception ex)[/align]
[align=left] {[/align]
[align=left] // 出错时回滚事务[/align]
[align=left] this.RollbackTransaction();[/align]
[align=left] ErrorHandler.HandleError(ex);[/align]
[align=left] }[/align]
[align=left] // 返回主键ID[/align]
[align=left] return stockadjust.StockAdjustID;[/align]
[align=left] }[/align]
[align=left] [/align]
l IsSuppressed方法的示例代码
同时下面的这个示例也说明了不同BLL层,相同BLL层事务处理的方法。
[align=left] ///<summary>[/align]
[align=left] ///审批采购单[/align]
[align=left] /// 1=未审批,2=审批通过,3=审批未通过,4=部分审批通过[/align]
[align=left] ///</summary>[/align]
[align=left] ///<param name="purchaseID">采购单ID</param>[/align]
[align=left] public void Approve(string purchaseID)[/align]
[align=left] {[/align]
[align=left] PurchaseDAL dal = new PurchaseDAL();[/align]
[align=left] PurchaseEntity purchase;[/align]
[align=left] try[/align]
[align=left] {[/align]
[align=left] ITransaction trans = this.BeginTransaction();[/align]
[align=left] // 重要方法,保证在同一事务内运行[/align]
[align=left] dal.SynchronizeTransaction(trans);[/align]
[align=left] [/align]
[align=left] // 由于在本类中GetEntity方法也使用了事务[/align]
[align=left]// 所以此处要挂起GetEntity事务的执行[/align]
[align=left] this.IsSuppressed = true;[/align]
[align=left] // 获取采购信息,此操作会自动使用当前事务[/align]
[align=left] purchase = GetEntity(purchaseID);[/align]
[align=left] [/align]
[align=left] purchase.PurchaseID = purchaseID;[/align]
[align=left] purchase.Status = "2";[/align]
[align=left] purchase.ApproveID = WebBasePage.GetCurrentSession().UserID;[/align]
[align=left] purchase.ApproveDate = DateTime.Now;[/align]
[align=left] dal.UpdateEntity(purchase);[/align]
[align=left] [/align]
[align=left] // 审批同意后更新库存[/align]
[align=left] StockEntity stock = null;[/align]
[align=left] StockEntities stocks;[/align]
[align=left] StockBLL stockBll = new StockBLL();[/align]
[align=left] // 重要方法,保证在同一事务内运行[/align]
[align=left] stockBll.SynchronizeTransaction(trans);[/align]
[align=left] [/align]
[align=left] // 根据product和type信息获取库存信息以便于记录日志[/align]
[align=left] QueryEntity query = new QueryEntity();[/align]
[align=left] query.BuildQueryWhere("Product", CompareTypeEnum.Equal, purchase.ProductID, LogicTypeEnum.And);[/align]
[align=left] query.BuildQueryWhere("TypeID", CompareTypeEnum.Equal, purchase.StockTypeID, LogicTypeEnum.And);[/align]
[align=left] [/align]
[align=left] stocks = stockBll.GetEntities(query);[/align]
[align=left] if (stocks.Count <= 0)[/align]
[align=left] {[/align]
[align=left] stock = new StockEntity();[/align]
[align=left] stock.ProductID = purchase.ProductID;[/align]
[align=left] stock.StockTypeID = purchase.StockTypeID;[/align]
[align=left] stock.StockNum = purchase.PurchaseNum;[/align]
[align=left] stock.KeepNum = 0;[/align]
[align=left] stock.WayNum = 0;[/align]
[align=left] stock.SafeNum = 0;[/align]
[align=left] stock.UserID = purchase.ApproveID;[/align]
[align=left] stock.OperateTime = purchase.ApproveDate;[/align]
[align=left] stockBll.Insert(stock); [/align]
[align=left] }[/align]
[align=left] else if (stocks.Count > 1)[/align]
[align=left] {[/align]
[align=left] // 抛出业务逻辑异常[/align]
[align=left] ErrorHandler.ThrowBusinessError("库存中多个同种产品,请检查!");[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] stock = stocks.GetItem(0);[/align]
[align=left] stock.StockNum = stock.StockNum + purchase.PurchaseNum;[/align]
[align=left] stockBll.Update(stock); [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] // 写库存操作日志[/align]
[align=left] StockLogEntity log = new StockLogEntity();[/align]
[align=left] StockLogBLL logBll = new StockLogBLL();[/align]
[align=left] // 重要方法,保证在同一事务内运行[/align]
[align=left] logBll.SynchronizeTransaction(trans);[/align]
[align=left] [/align]
[align=left] log.ProductID = purchase.ProductID;[/align]
[align=left] log.StockTypeID = purchase.StockTypeID;[/align]
[align=left] log.StockOptNum = purchase.PurchaseNum;[/align]
[align=left] log.KeepOptNum = 0;[/align]
[align=left] log.WayOptNum = 0;[/align]
[align=left] log.StockNum = stock.StockNum;[/align]
[align=left] log.KeepNum = stock.KeepNum;[/align]
[align=left] log.WayNum = stock.WayNum;[/align]
[align=left] log.Remark = "采购";[/align]
[align=left] log.ObjNO = purchaseID;[/align]
[align=left] log.OperateTime = DateTime.Now;[/align]
[align=left] log.UserID = purchase.ApproveID;[/align]
[align=left] logBll.Insert(log);[/align]
[align=left] [/align]
[align=left] // 恢复事务的执行[/align]
[align=left] this.IsSuppressed = false;[/align]
[align=left] this.CommitTransaction();[/align]
[align=left] }[/align]
[align=left] catch (Exception ex)[/align]
[align=left] {[/align]
[align=left] this.RollbackTransaction();[/align]
[align=left] ErrorHandler.HandleError(ex);[/align]
[align=left] }[/align]
[align=left] }[/align]
1.10 TransactionService类
用于提供COM+事务的基类。
TransactionService类是框架的重要类之一,用于提供对分布式事务的支持。由于本功能实际上是使用了COM+提供的事务控制功能,因此必须将使用此类的程序集部署到COM+运行环境中。配置COM+应用的方法如下:
[align=left] [/align]
[align=left] 1. 使用sn.exe工具为程序集生成强名称[/align]
[align=left] 2. 将强名称程序集部署到全局程序集缓存[/align]
[align=left] gacutil -nologo -i MyAssemble.dll[/align]
[align=left] 3. 将强名称程序集部署到COM+中[/align]
[align=left] regsvcs -nologo MyAssemble.dll[/align]
[align=left] [/align]
[align=left] 从COM+中卸载的例子:[/align]
[align=left] 1. 先从COM+中卸载[/align]
[align=left] regsvcs -nologo -u MyAssemble.dll[/align]
[align=left] 2. 从全局程序集缓存中卸载[/align]
[align=left] gacutil -nologo -u MyAssemble.dll[/align]
关于COM+的具体信息,请参见MSDN。
1.11 Access类
[align=left]实际的数据访问基类,用户的DAL层要从此类继承。[/align]
1.12 SqlBuilder类
用于根据实体生成SQL语句的类。框架的重要类之一。
1.13 BaseEntities类
所有实体集合类的基类,提供了序列化、索引器,枚举器、DataTable转换功能。
1.14 BaseEntity类
所有实体类的基类,提供获取实体O/R Mapping相关信息、DataTable转换功能。
1.15 QueryEntities类
用于查询的实体集合类,即容器类。此类支持索引器、枚举器功能。
1.16 QueryEntity类
用于查询的实体类。QueryEntity类在传递查询条件时十分有用,可以自动生成相对应的SQL条件语句,并且在参数类型方面也可以根据实体映射自动识别参数类型,长度等信息。QueryEntity类主要属性如下表:
1.17 QueryWhereEntities类
查询条件容器类,功能同QueryEntities类。
1.18 QueryWhereEntity类
查询条件实体类。具体属性如下表:
1.19 QueryGroupEntities类
分组条件容器类,功能同QueryEntities类。
1.20 QueryGroupEntity类
分组条件实体类。具体属性如下表:
1.21 QueryOrderEntities类
排序条件容器类,功能同QueryEntities类。
1.22 QueryOrderEntity类
排序条件实体类。具体属性如下表:
1.23 ParameterEntities类
参数实体容器类,功能同QueryEntities类。
1.24 ParameterEntity类
参数实体类。具体属性如下表:
1.25 Error类
自定义异常类,继承于ApplicationException。用于扩展异常信息。
1.26 ErrorHandler类
用于显示的处理的自定义异常的类。
1.27 Logger类
日志处理类。配置信息如下:
[align=left] <!--是否记录日志-->[/align]
[align=left] <addkey="LogEnabled"value="true|false"/>[/align]
[align=left] <!--日志文件名称及位置--> [/align]
[align=left] <addkey="LogFile"value="c://log.txt"/>[/align]
[align=left] <!--日志文件的最大尺寸--> [/align]
[align=left] <addkey="LogMaxSize"value="10M"/>[/align]
[align=left] <!--是否在页面上显示详细的日志信息--> [/align]
[align=left] <addkey="ShowErrors"value="true|false"/>[/align]
[align=left] [/align]
1.28 ORMapingAttribute类
O/R Mapping实现类,框架的重要类之一。属性如下表:
1.29 WebBasePage类
Web页面基类,提供Session控制、权限检测、错误处理等常用功能。
1.30 WebSession类
会话对象实体类,属性说明如下表:
1.31 WinBaseForm类
1.32 WinSession类
作者Blog:http://blog.csdn.net/Moneystar/
1.1 ITransaction接口
用于事务控制的接口,接口方法如下表:
方法名称 | 方法说明 |
BeginTransaction(+2次重载) | 开始事务 |
CommitTransaction | 递交事务 |
RollbackTransaction | 回滚事务 |
用于数据库访问的接口。通过工厂方法创建该接口的实例,实现动态数据库的调用。IDBUtil变相的实现了ADO.NET的IDbCommand接口,因此只要您熟悉IDbCommand接口方法,您就可以很容易的使用实现了IDBUtil接口的方法,具体方法如下表:
方法名称 | 方法说明 |
ExecuteNonQuery(+4次重载) | 对连接执行 Transact-SQL 语句并返回受影响的行数 |
ExecuteScalar(+2次重载) | 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略额外的列或行。 |
GetDataTable(+4次重载) | 获取数据集 |
用于访问Access数据库的类。AccessDBUtil类继承了ITransaction、IDBUtil接口,因此当根据数据库类型实例化ITransaction或IDBUtil接口时,实际上实例化本类,从而封装客户代码对不同数据库的访问功能。AccessDBUtil类的具体方法如下表:
方法名称 | 方法说明 |
BeginTransaction(+2次重载) | 开始事务 |
CommitTransaction | 递交事务 |
RollbackTransaction | 回滚事务 |
ExecuteNonQuery(+4次重载) | 对连接执行 Transact-SQL 语句并返回受影响的行数 |
ExecuteScalar(+2次重载) | 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略额外的列或行。 |
GetDataTable(+4次重载) | 获取数据集 |
用于访问Sql Server数据库的类。同AccessDBUtil类。
方法名称 | 方法说明 |
BeginTransaction(+2次重载) | 开始事务 |
CommitTransaction | 递交事务 |
RollbackTransaction | 回滚事务 |
ExecuteNonQuery(+4次重载) | 对连接执行 Transact-SQL 语句并返回受影响的行数 |
ExecuteScalar(+2次重载) | 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略额外的列或行。 |
GetDataTable(+4次重载) | 获取数据集 |
用于访问Oracle数据库的类。同AccessDBUtil类。
方法名称 | 方法说明 |
BeginTransaction(+2次重载) | 开始事务 |
CommitTransaction | 递交事务 |
RollbackTransaction | 回滚事务 |
ExecuteNonQuery(+4次重载) | 对连接执行 Transact-SQL 语句并返回受影响的行数 |
ExecuteScalar(+2次重载) | 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略额外的列或行。 |
GetDataTable(+4次重载) | 获取数据集 |
Connector类采用单件模式创建,用于从Web.Config文件中获取数据库的连接信息。
方法/属性名称 | 方法/属性说明 |
GetInstance方法 | 取得单件实例 |
DataBaseType属性 | 数据库类型 |
DataBaseConnection属性 | 数据库连接字符串 |
[align=left]<appSettings>[/align]
[align=left] [/align]
[align=left] <!--数据库连接字符串-->[/align]
[align=left] <addkey="DBConnection"value=""/>[/align]
[align=left] <!--数据库可选类型:Sql,Oracle,Access-->[/align]
[align=left] <addkey="DBType"value="Access"/>[/align]
[align=left] [/align]
[align=left]</appSettings>[/align]
1.7 Factory类
[align=left]用于实现工厂方法的类。通过Factory类获取ITransaction、IDBUtil接口的实例,从而实现对不同数据库的封装。[/align]
方法名称 | 方法说明 |
GetInstance(+2次重载) | 取得工厂实例 |
[align=left]用于提供事务的类。具体方法如下表:[/align]
方法/属性名称 | 方法/属性说明 |
BeginTransaction方法 | 开始事务 |
CommitTransaction方法 | 递交事务 |
RollbackTransaction方法 | 回滚事务 |
[align=left]Transaction类用于方便、灵活的控制同一业务层方法内的事务,如需在不同业务层之间、不同方法之间控制事务,请使用TransactionScope类。[/align]
1.9 TransactionScope类
[align=left]用于提供事务的基类。具体方法如下表:[/align]
方法/属性名称 | 方法/属性说明 |
BeginTransaction方法 | 开始事务 |
CommitTransaction方法 | 递交事务 |
RollbackTransaction方法 | 回滚事务 |
SynchronizeTransaction方法 | 同步事务 |
IsSuppressed属性 | 指示是否临时挂起事务,挂起的事务不会执行Commit、Rollback方法 |
SynchronizeTransaction方法用于同步不同业务层的事务。举例来说:A业务用于更新库存,其有自己的事务。B业务用于记录日志,也有自己独立的事务。但当A调用B时,就要保证A和B共用同一事务,此时就用到了本方法,其实质也就是传递了一个ITransaction类型的参数。另外,如果同一个BLL层的事务有如下情况,比如说:方法A调用了方法B,A有事务控制,B也有事务控制,那么也要保证A与B使用同一个事务,此时就用到了IsSuppressed属性,将IsSuppressed属性设置为真,则不会执行递交事务,回滚事务方法,当需要执行事务时,再将其值设置为假即可。因此,从上面的说明可以看出,SynchronizeTransaction与IsSuppressed都是用于做事务控制的,而二者的区别是前者用于不同BLL层同步事务的处理,而后者用于同一BLL层内不同方法间的同步事务处理。
l SynchronizeTransaction方法的示例代码如下:
[align=left] ///<summary>[/align]
[align=left] ///用于库存调整的业务逻辑类[/align]
[align=left] ///继承于TransactionScope类,以提供事务的控制[/align]
[align=left] ///</summary>[/align]
[align=left] public class StockAdjustBLL : TransactionScope[/align]
[align=left] {[/align]
[align=left] ///<summary>[/align]
[align=left] ///新建库存调整单[/align]
[align=left] ///</summary>[/align]
[align=left] ///<returns>生成的主键ID</returns>[/align]
[align=left] public string Insert()[/align]
[align=left] {[/align]
[align=left] // DAL层数据库访问方法类[/align]
[align=left] StockAdjustDAL dal = new StockAdjustDAL();[/align]
[align=left] [/align]
[align=left] try[/align]
[align=left] {[/align]
[align=left] // 调用DBTransaction 类的BeginTransaction方法启动事务[/align]
[align=left] ITransaction trans = this.BeginTransaction();[/align]
[align=left] // 将事务参数赋予数据访问层[/align]
[align=left] dal.SynchronizeTransaction(trans);[/align]
[align=left] [/align]
[align=left] // 注意:第一个访问事务[/align]
[align=left] StockAdjustEntity stockadjust = new StockAdjustEntity();[/align]
[align=left] // 插入库存调整表数据[/align]
[align=left] dal.InsertEntity(stockadjust);[/align]
[align=left] [/align]
[align=left]// 注意:第二个访问事务[/align]
[align=left] StockEntity stock = new StockEntity();[/align]
[align=left] StockBLL stockBll = new StockBLL();[/align]
[align=left] // 重要方法,保证在不同的BLL层在同一事务内运行[/align]
[align=left] stockBll.SynchronizeTransaction(trans);[/align]
[align=left] // 更新库存[/align]
[align=left] stockBll.Update(stock); [/align]
[align=left] [/align]
[align=left]// 注意:第三个访问事务[/align]
[align=left] // 写库存操作日志[/align]
[align=left] StockLogEntity log = new StockLogEntity();[/align]
[align=left] StockLogBLL logBll = new StockLogBLL();[/align]
[align=left] // 重要方法,保证在不同的BLL层在同一事务内运行[/align]
[align=left] logBll.SynchronizeTransaction(trans);[/align]
[align=left] // 写库存操作日志[/align]
[align=left] logBll.Insert(log);[/align]
[align=left] [/align]
[align=left] // 最后递交事务[/align]
[align=left] this.CommitTransaction();[/align]
[align=left] }[/align]
[align=left] catch (Exception ex)[/align]
[align=left] {[/align]
[align=left] // 出错时回滚事务[/align]
[align=left] this.RollbackTransaction();[/align]
[align=left] ErrorHandler.HandleError(ex);[/align]
[align=left] }[/align]
[align=left] // 返回主键ID[/align]
[align=left] return stockadjust.StockAdjustID;[/align]
[align=left] }[/align]
[align=left] [/align]
l IsSuppressed方法的示例代码
同时下面的这个示例也说明了不同BLL层,相同BLL层事务处理的方法。
[align=left] ///<summary>[/align]
[align=left] ///审批采购单[/align]
[align=left] /// 1=未审批,2=审批通过,3=审批未通过,4=部分审批通过[/align]
[align=left] ///</summary>[/align]
[align=left] ///<param name="purchaseID">采购单ID</param>[/align]
[align=left] public void Approve(string purchaseID)[/align]
[align=left] {[/align]
[align=left] PurchaseDAL dal = new PurchaseDAL();[/align]
[align=left] PurchaseEntity purchase;[/align]
[align=left] try[/align]
[align=left] {[/align]
[align=left] ITransaction trans = this.BeginTransaction();[/align]
[align=left] // 重要方法,保证在同一事务内运行[/align]
[align=left] dal.SynchronizeTransaction(trans);[/align]
[align=left] [/align]
[align=left] // 由于在本类中GetEntity方法也使用了事务[/align]
[align=left]// 所以此处要挂起GetEntity事务的执行[/align]
[align=left] this.IsSuppressed = true;[/align]
[align=left] // 获取采购信息,此操作会自动使用当前事务[/align]
[align=left] purchase = GetEntity(purchaseID);[/align]
[align=left] [/align]
[align=left] purchase.PurchaseID = purchaseID;[/align]
[align=left] purchase.Status = "2";[/align]
[align=left] purchase.ApproveID = WebBasePage.GetCurrentSession().UserID;[/align]
[align=left] purchase.ApproveDate = DateTime.Now;[/align]
[align=left] dal.UpdateEntity(purchase);[/align]
[align=left] [/align]
[align=left] // 审批同意后更新库存[/align]
[align=left] StockEntity stock = null;[/align]
[align=left] StockEntities stocks;[/align]
[align=left] StockBLL stockBll = new StockBLL();[/align]
[align=left] // 重要方法,保证在同一事务内运行[/align]
[align=left] stockBll.SynchronizeTransaction(trans);[/align]
[align=left] [/align]
[align=left] // 根据product和type信息获取库存信息以便于记录日志[/align]
[align=left] QueryEntity query = new QueryEntity();[/align]
[align=left] query.BuildQueryWhere("Product", CompareTypeEnum.Equal, purchase.ProductID, LogicTypeEnum.And);[/align]
[align=left] query.BuildQueryWhere("TypeID", CompareTypeEnum.Equal, purchase.StockTypeID, LogicTypeEnum.And);[/align]
[align=left] [/align]
[align=left] stocks = stockBll.GetEntities(query);[/align]
[align=left] if (stocks.Count <= 0)[/align]
[align=left] {[/align]
[align=left] stock = new StockEntity();[/align]
[align=left] stock.ProductID = purchase.ProductID;[/align]
[align=left] stock.StockTypeID = purchase.StockTypeID;[/align]
[align=left] stock.StockNum = purchase.PurchaseNum;[/align]
[align=left] stock.KeepNum = 0;[/align]
[align=left] stock.WayNum = 0;[/align]
[align=left] stock.SafeNum = 0;[/align]
[align=left] stock.UserID = purchase.ApproveID;[/align]
[align=left] stock.OperateTime = purchase.ApproveDate;[/align]
[align=left] stockBll.Insert(stock); [/align]
[align=left] }[/align]
[align=left] else if (stocks.Count > 1)[/align]
[align=left] {[/align]
[align=left] // 抛出业务逻辑异常[/align]
[align=left] ErrorHandler.ThrowBusinessError("库存中多个同种产品,请检查!");[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] stock = stocks.GetItem(0);[/align]
[align=left] stock.StockNum = stock.StockNum + purchase.PurchaseNum;[/align]
[align=left] stockBll.Update(stock); [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] // 写库存操作日志[/align]
[align=left] StockLogEntity log = new StockLogEntity();[/align]
[align=left] StockLogBLL logBll = new StockLogBLL();[/align]
[align=left] // 重要方法,保证在同一事务内运行[/align]
[align=left] logBll.SynchronizeTransaction(trans);[/align]
[align=left] [/align]
[align=left] log.ProductID = purchase.ProductID;[/align]
[align=left] log.StockTypeID = purchase.StockTypeID;[/align]
[align=left] log.StockOptNum = purchase.PurchaseNum;[/align]
[align=left] log.KeepOptNum = 0;[/align]
[align=left] log.WayOptNum = 0;[/align]
[align=left] log.StockNum = stock.StockNum;[/align]
[align=left] log.KeepNum = stock.KeepNum;[/align]
[align=left] log.WayNum = stock.WayNum;[/align]
[align=left] log.Remark = "采购";[/align]
[align=left] log.ObjNO = purchaseID;[/align]
[align=left] log.OperateTime = DateTime.Now;[/align]
[align=left] log.UserID = purchase.ApproveID;[/align]
[align=left] logBll.Insert(log);[/align]
[align=left] [/align]
[align=left] // 恢复事务的执行[/align]
[align=left] this.IsSuppressed = false;[/align]
[align=left] this.CommitTransaction();[/align]
[align=left] }[/align]
[align=left] catch (Exception ex)[/align]
[align=left] {[/align]
[align=left] this.RollbackTransaction();[/align]
[align=left] ErrorHandler.HandleError(ex);[/align]
[align=left] }[/align]
[align=left] }[/align]
1.10 TransactionService类
用于提供COM+事务的基类。
方法名称 | 方法说明 |
CompleteTx | 递交事务 |
AbortTx | 回滚事务 |
[align=left] [/align]
[align=left] 1. 使用sn.exe工具为程序集生成强名称[/align]
[align=left] 2. 将强名称程序集部署到全局程序集缓存[/align]
[align=left] gacutil -nologo -i MyAssemble.dll[/align]
[align=left] 3. 将强名称程序集部署到COM+中[/align]
[align=left] regsvcs -nologo MyAssemble.dll[/align]
[align=left] [/align]
[align=left] 从COM+中卸载的例子:[/align]
[align=left] 1. 先从COM+中卸载[/align]
[align=left] regsvcs -nologo -u MyAssemble.dll[/align]
[align=left] 2. 从全局程序集缓存中卸载[/align]
[align=left] gacutil -nologo -u MyAssemble.dll[/align]
关于COM+的具体信息,请参见MSDN。
1.11 Access类
[align=left]实际的数据访问基类,用户的DAL层要从此类继承。[/align]
方法名称 | 方法说明 |
GetDBUtil | 获取指定数据库访问对象 |
SynchronizeTransaction | 同步事务 |
GetGuid | 获取GUID |
GetEntity | 获取实体 |
GetEntitiesCount | 获取实体个数 |
GetEntities | 获取实体集 |
InsertEntity | 新增 |
UpdateEntity | 更新 |
DeleteEntity | 删除 |
GetSequence | 获取序列值(目前只针对Oracle) |
用于根据实体生成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条件的保留字符,如:%、_、[、^ |
所有实体集合类的基类,提供了序列化、索引器,枚举器、DataTable转换功能。
方法名称 | 方法说明 |
ConvertTo | 将实体集合转换成DataTable形式 |
ConvertFrom | 通过实体映射的字段名将DataTable值解析成实体集合 |
Parse | 通过实体映射的属性名将DataTable值解析成实体集合 |
GetItem | 通过索引获取 |
SetItem | 设置实体 |
Add | 增加 |
Remove | 通过索引移除 |
Clear | 全部移除 |
Count | 获取个数 |
所有实体类的基类,提供获取实体O/R Mapping相关信息、DataTable转换功能。
方法名称 | 方法说明 |
ConvertTo | 将实体集合转换成DataTable形式 |
ConvertFrom | 通过实体映射的字段名将DataTable值解析成实体集合 |
Parse | 通过实体映射的属性名将DataTable值解析成实体集合 |
GetTableName(+2次重载) | 获取实体映射的表名 |
GetPropertyName | 获取数据库字段名对应的属性名,如果找不到对应的属性名则返回传入的字段名 |
GetPropertyNames | 获取实体的所有属性名的数组形式 |
GetFieldName | 获取实体映射的字段名,如果找不到对应的字段名则返回传入的属性名 |
GetFieldNames | 获取实体映射的字段名所有字段名的数组形式 |
GetPropertyValue | 获取实体的属性值,如果指定的属性名不存在则返回null |
GetDataType | 获取实体映射的数据类型,如果指定的属性名不存在则使用字段名再次进行查询,如果还不存在,则返回DataTypeEnum.Default,建议使用属性名进行获取以符合O/R Mappgin的思想 |
IsPK | 获取实体映射的字段是否是主键,如果指定的属性名不存在则返回false |
IsSelected | 获取实体映射的字段是否可以Select,如果指定的属性名不存在则返回false |
IsInserted | 获取实体映射的字段是否可以Insert,如果指定的属性名不存在则返回false |
IsUpdated | 获取实体映射的字段是否可以Update,如果指定的属性名不存在则返回false |
用于查询的实体集合类,即容器类。此类支持索引器、枚举器功能。
方法名称 | 方法说明 |
GetItem | 通过索引获取 |
SetItem | 设置实体 |
Add | 增加 |
Remove | 通过索引移除 |
Clear | 全部移除 |
Count | 获取个数 |
用于查询的实体类。QueryEntity类在传递查询条件时十分有用,可以自动生成相对应的SQL条件语句,并且在参数类型方面也可以根据实体映射自动识别参数类型,长度等信息。QueryEntity类主要属性如下表:
属性名称 | 属性说明 |
PageIndex | 要查询的页数 |
PageSize | 查询页显示的记录数 |
RecordCount | 总记录数 |
WhereEntities | 过滤条件 |
GroupEntities | 分组条件 |
OrderEntities | 排序条件 |
查询条件容器类,功能同QueryEntities类。
1.18 QueryWhereEntity类
查询条件实体类。具体属性如下表:
属性名称 | 属性说明 |
CompareType | 比较操作符 |
LogicType | 逻辑操作符 |
BracketType | 括号类型 |
FieldName | 字段名,可以属性名,也可以实际的数据表字段名,在生成条件时会自动进行匹配 |
DataType | 字段类型,对于没有进行O/R Mapping设置的实体类,必须指定实际的类型 |
FieldValue | 字段值 |
分组条件容器类,功能同QueryEntities类。
1.20 QueryGroupEntity类
分组条件实体类。具体属性如下表:
属性名称 | 属性说明 |
FieldName | 字段名,可以属性名,也可以实际的数据表字段名,在生成条件时会自动进行匹配 |
排序条件容器类,功能同QueryEntities类。
1.22 QueryOrderEntity类
排序条件实体类。具体属性如下表:
属性名称 | 属性说明 |
FieldName | 字段名,可以属性名,也可以实际的数据表字段名,在生成条件时会自动进行匹配 |
OrderType | 排序方式 |
参数实体容器类,功能同QueryEntities类。
1.24 ParameterEntity类
参数实体类。具体属性如下表:
属性名称 | 属性说明 |
ParameterName | 参数名,可以属性名,也可以实际的数据表字段名,在生成参数时会自动进行匹配 |
ParameterValue | 参数值 |
ParameterType | 对于没有进行O/R Mapping设置的实体类,必须指定实际的类型 |
ParameterDirection | 参数方向,可以是输入参数、输入输出参数、输出参数、返回值参数 |
自定义异常类,继承于ApplicationException。用于扩展异常信息。
属性名称 | 属性说明 |
ErrorID | 异常ID |
ErrorType | 异常类型 |
MachineName | 异常所在机器名 |
ErrorTime | 异常发成时间 |
SqlCommand | 引发异常的SQL语句 |
UserID | 引发异常的用户ID |
VisitPage | 引发异常的页面 |
Description | 自定义的异常详细描述信息 |
用于显示的处理的自定义异常的类。
方法名称 | 方法说明 |
HandleError | 处理异常,并根据配置信息决定是否记录日志 |
ThrowBusinessError | 抛出业务逻辑异常 |
ThrowTechError | 抛出技术异常 |
日志处理类。配置信息如下:
[align=left] <!--是否记录日志-->[/align]
[align=left] <addkey="LogEnabled"value="true|false"/>[/align]
[align=left] <!--日志文件名称及位置--> [/align]
[align=left] <addkey="LogFile"value="c://log.txt"/>[/align]
[align=left] <!--日志文件的最大尺寸--> [/align]
[align=left] <addkey="LogMaxSize"value="10M"/>[/align]
[align=left] <!--是否在页面上显示详细的日志信息--> [/align]
[align=left] <addkey="ShowErrors"value="true|false"/>[/align]
[align=left] [/align]
方法名称 | 方法说明 |
WriteLog | 记录日志 |
O/R Mapping实现类,框架的重要类之一。属性如下表:
属性名称 | 属性说明 |
TableName | 表名 |
FieldName | 字段名 |
IsPK | 是否是主键 |
IsSelected | Select时是否包含 |
IsInserted | Insert时是否包含 |
IsUpdated | Update时是否包含 |
RelationName | 表之间的关联信息,可以是join关联,也可是子查询关联 |
Web页面基类,提供Session控制、权限检测、错误处理等常用功能。
方法名称 | 方法说明 |
GetCurrentSession | 获取当前会话对象 |
IsLogin | 判断是否已登录 |
LogOut | 注销 |
OnLoad | 重载登录方法,用于判断是否已登录 |
OnError | 重载出错时的处理方法,以支持统一的异常处理方式、日志记录方式 |
MessageBox(+3次重载) | 显示具有指定文本的消息框 |
GetAppPath | 获取当前WEB应用程序的绝对路径 |
GetCurrentPage | 获取当前访问的页面 |
OneClickButton(+1次重载) | 使得服务端Button在一次Postback中只能点击一次 |
会话对象实体类,属性说明如下表:
属性名称 | 属性说明 |
WebSessionID | 会话ID |
UserID | 用户ID |
UserName | 用户姓名 |
LoginName | 用户登录名 |
OrganID | 组织ID |
OrganName | 组织名称 |
DeptID | 部门ID |
DeptName | 部门名称 |
RoleID | 角色ID |
RoleName | 角色名称 |
CountryCode | 国家代码 |
LanguageCode | 语言代码 |
1.32 WinSession类
作者Blog:http://blog.csdn.net/Moneystar/
相关文章推荐
- NFramework开源AOP框架设计文档
- NFramework开源AOP框架基本设计类图
- NFramework开源AOP框架ORM地完成机制与运用
- NFramework开源AOP框架ORM的实现原理与应用
- NFramework开源AOP框架开发手册
- NFramework开源AOP框架ORM的实现原理与应用-.NET教程,.NET Framework
- NFramework开源AOP框架介绍
- 各开源框架使用与设计总结
- NFramework开源AOP框架ORM的实现原理与应用
- java基础设计 开源框架
- [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计
- 【开源】.Net Aop(静态织入)框架 BSF.Aop
- java基础设计 开源框架
- 用开源AOP简化MVVM框架
- 2017-05-04-Facebook出品的Android声明式开源新框架Litho文档翻译-总览和导航
- 开源XDesigner ORM 框架设计
- NFramework开源AOP框架ORM的实现原理与应用
- java基础设计 开源框架
- 设计模式在开源框架中的应用
- 【开源】OSharp框架解说系列(5.1):EntityFramework数据层设计