zoukankan      html  css  js  c++  java
  • NFramework开源AOP框架设计文档

     

    1.1       ITransaction接口

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

    方法名称

    方法说明

    BeginTransaction(+2次重载)

    开始事务

    CommitTransaction

    递交事务

    RollbackTransaction

    回滚事务

    1.2       IDBUtil接口

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

    方法名称

    方法说明

    ExecuteNonQuery(+4次重载)

    对连接执行 Transact-SQL 语句并返回受影响的行数

    ExecuteScalar(+2次重载)

    执行查询,并返回查询所返回的结果集中第一行的第一列。忽略额外的列或行。

    GetDataTable(+4次重载)

    获取数据集

    1.3       AccessDBUtil

    用于访问Access数据库的类。AccessDBUtil类继承了ITransactionIDBUtil接口,因此当根据数据库类型实例化ITransactionIDBUtil接口时,实际上实例化本类,从而封装客户代码对不同数据库的访问功能。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>

          <!--数据库连接字符串-->

         <addkey="DBConnection"value=""/>

         <!--数据库可选类型:Sql,Oracle,Access-->

         <addkey="DBType"value="Access"/>

      

    </appSettings>

    1.7       Factory

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

    方法名称

    方法说明

    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时,就要保证AB共用同一事务,此时就用到了本方法,其实质也就是传递了一个ITransaction类型的参数。另外,如果同一个BLL层的事务有如下情况,比如说:方法A调用了方法BA有事务控制,B也有事务控制,那么也要保证AB使用同一个事务,此时就用到了IsSuppressed属性,将IsSuppressed属性设置为真,则不会执行递交事务,回滚事务方法,当需要执行事务时,再将其值设置为假即可。因此,从上面的说明可以看出,SynchronizeTransactionIsSuppressed都是用于做事务控制的,而二者的区别是前者用于不同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

    获取GUID

    GetEntity

    获取实体

    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

    获取实体的属性值,如果指定的属性名不存在则返回null

    GetDataType

    获取实体映射的数据类型,如果指定的属性名不存在则使用字段名再次进行查询,如果还不存在,则返回DataTypeEnum.Default,建议使用属性名进行获取以符合O/R Mappgin的思想

    IsPK

    获取实体映射的字段是否是主键,如果指定的属性名不存在则返回false

    IsSelected

    获取实体映射的字段是否可以Select,如果指定的属性名不存在则返回false

    IsInserted

    获取实体映射的字段是否可以Insert,如果指定的属性名不存在则返回false

    IsUpdated

    获取实体映射的字段是否可以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

    异常ID

    ErrorType

    异常类型

    MachineName

    异常所在机器名

    ErrorTime

    异常发成时间

    SqlCommand

    引发异常的SQL语句

    UserID

    引发异常的用户ID

    VisitPage

    引发异常的页面

    Description

    自定义的异常详细描述信息

    1.26   ErrorHandler

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

    方法名称

    方法说明

    HandleError

    处理异常,并根据配置信息决定是否记录日志

    ThrowBusinessError

    抛出业务逻辑异常

    ThrowTechError

    抛出技术异常

    1.27   Logger

    日志处理类。配置信息如下:

            <!--是否记录日志-->

            <addkey="LogEnabled"value="true|false"/>

            <!--日志文件名称及位置-->  

            <addkey="LogFile"value="c:""log.txt"/>

            <!--日志文件的最大尺寸-->  

            <addkey="LogMaxSize"value="10M"/>

            <!--是否在页面上显示详细的日志信息-->  

            <addkey="ShowErrors"value="true|false"/>

    方法名称

    方法说明

    WriteLog

    记录日志

    1.28   ORMapingAttribute

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

    属性名称

    属性说明

    TableName

    表名

    FieldName

    字段名

    IsPK

    是否是主键

    IsSelected

    Select时是否包含

    IsInserted

    Insert时是否包含

    IsUpdated

    Update时是否包含

    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

    会话ID

    UserID

    用户ID

    UserName

    用户姓名

    LoginName

    用户登录名

    OrganID

    组织ID

    OrganName

    组织名称

    DeptID

    部门ID

    DeptName

    部门名称

    RoleID

    角色ID

    RoleName

    角色名称

    CountryCode

    国家代码

    LanguageCode

    语言代码

    1.31   WinBaseForm

    1.32   WinSession

  • 相关阅读:
    【转载】利用一个堆溢出漏洞实现 VMware 虚拟机逃逸
    metasploit(MSF)终端命令大全
    Linux怎么开启ssh
    Day5_模块与包(import)(form......import....)
    Day5_递归_二分法
    Day5_协程函数_面向过程
    Day4_生成器_三元表达式_列表解析_生成器表达式
    Day4_迭代器
    openssh升级的坑爹之路
    Day4_装饰器
  • 原文地址:https://www.cnblogs.com/meiproject/p/995743.html
Copyright © 2011-2022 走看看