DataRabbit 轻量的ORM框架(17)-- 使用DataRabbit的最佳实践

     在DataRabbit 轻量的数据访问框架(12)-- 将DataRabbit融入架构 一文中介绍了如何将DataRabbit与三层架构结合起来,但是,在实际的项目中,每一层是如何使用DataRabbit的了?本文将展示作者在项目中使用DataRabbit的标准做法。

     我们以CompanyUser表和MemberShip表为例说明如下:

     比如我们有个虚构的业务流程(仅用于示例)如下:根据UserID找到对应的MemberShip记录,然后根据MemberShip记录的UserState项的值来决定是否要删除CompanyUser表对应的用户记录。

     对于此业务逻辑,涉及到两个BEM类和一个BL类,首先来看两个BEM:MembershipBEM和CompanyUserBEM。

 

public class MembershipBEM
    {
        private TransactionScope transactionScope;

        public MembershipBEM(TransactionScope scope)
        {
            this.transactionScope = scope;
        }
     
        public Membership GetOne(string userID)
        {
            IOrmAccesser<Membership> accesser = this.transactionScope.NewOrmAccesser<Membership>();

            return accesser.GetOne(new Filter(Membership._UserID ,userID)) ;
        }
    }

 

    public class CompanyUserBEM
    {
        private TransactionScope transactionScope;

        public CompanyUserBEM(TransactionScope scope)
        {
            this.transactionScope = scope;
        }

        public void Delete(string userID)
        {
            IOrmAccesser<CompanyUser> companyUserOrmAcceser = this.transactionScope.NewOrmAccesser<CompanyUser>();
            companyUserOrmAcceser.Delete(new Filter(CompanyUser._UserID ,userID));
        }

    }

 

     大家可以看到:

(1)所有的BEM类的构造函数都接收一个TransactionScope类型作为参数,并将其保存在成员变量中。

(2)所有的数据库访问器实例,都是由TransactionScope相应的New操作产生(如NewOrmAccesser()方法创建一个ORM访问器)

(3)所有的数据库操作由TransactionScope产生的访问器来进行(关于更多的访问器,可参考本系列前面的文章)。

 

     ok,针对目标业务逻辑,BEM层的动作就这么多。BL层将会把相关的BEM操作整合成一个业务流

     我们来看针对示例业务逻辑的BL实现:

    public class CompanyUserBL
    {
        #region TransactionScopeFactory
        private TransactionScopeFactory transactionScopeFactory;
        public TransactionScopeFactory TransactionScopeFactory
        {
            set { transactionScopeFactory = value; }
        }
        #endregion

        public void DeleteIfInvalidUser(string userID)
        {
            using (TransactionScope scope = this.transactionScopeFactory.NewTransactionScope(false))
            {
                MembershipBEM membershipBEM = new MembershipBEM(scope);
                Membership member = membershipBEM.GetOne(userID);
                if (member.State == UserState.Invalid)
                {
                    CompanyUserBEM companyUserBEM = new CompanyUserBEM(scope);
                    companyUserBEM.Delete(userID);
                }
                scope.Commit();
            }
        }
    }

     大家看到:

(1)所有的BL都有一个注入属性——TransactionScopeFactory,表明目标业务流程将针对哪个数据库进行操作。

(2)在一个业务流程中,所有的BEM使用同一个TransactionScope实例,如此,便可以在一个Transaction中将相应的所有的BEM操作封装为一个事务支持的业务流。

(3)要启用Transaction,只需要将 TransactionScopeFactory的NewTransactionScope()方法传入的参数改为true即可,如:

          using (TransactionScope scope = this.transactionScopeFactory.NewTransactionScope(true))

          {

               //。。。。。。

          }

(4)无论是否启用了Transaction,离开using的最后一句一定是scope.Commit();用以提交操作。

 

     以上便是使用DataRabbit结合3层架构的最佳实践做法(我所知道的:))。

     最后,简单说一下TransactionScopeFactory,实际上,我们只需要为每个数据库配置一个TransactionScopeFactory实例即可,BL类可以公用这一个实例。比如,我使用Spring配置一个TransactionScopeFactory实例:

  <object name="dataConfiguration" type="DataRabbit.DataConfiguration,DataRabbit">
    <property name="DataBaseType" value="SqlServer"/>
    <property name="DataBaseName" value="MasterDb"/>
    <property name="IP" value="192.168.0.2"/>
    <property name="User" value="sa"/>
    <property name="Password" value="testpwd"/>
  </object>

  <object name="transactionScopeFactory" type="DataRabbit.Application.TransactionScopeFactory ,DataRabbit.Application" init-method="Initialize">
    <property name="DataConfiguration" ref="dataConfiguration"/>    
  </object>

     示例的CompanyUserBL类的实例只需要注入该transactionScopeFactory即可。  

 

转到:DataRabbit 轻量的数据访问框架 -- 序 

 

     

时间: 2024-09-18 01:49:10

DataRabbit 轻量的ORM框架(17)-- 使用DataRabbit的最佳实践的相关文章

DataRabbit 轻量的ORM框架(18)-- 捕获数据库访问异常的详细信息

     最新版本的DataRabbit(版本号:V3.2)新增一项重要功能--可以捕获访问数据库时产生的异常的详细信息,包括:异常对象.Sql语句.sql参数的名称和值.这是由IDBOperationLogger接口提供支持的.     /// <summary>     /// IDBOperationLogger 用于捕获住DB操作异常.可以用于记录DB操作失败时的语句和参数.     /// </summary>    public interface IDBOperati

DataRabbit 轻量的数据访问框架(13)--DataRabbit 3.0 ORM性能大幅度提升!

   DataRabbit 3.0重写了DataRabbit 2.0的ORM实现的内核,性能提升了90倍左右,结果是DataRabbit 3.0的ORM性能与直接使用ADO.NET的性能已经非常接近.这是如何做到的?   主要是基于两点:(1)DataRabbit 2.0 基于泛型和反射实现,而DataRabbit 3.0 基于泛型和Emit动态程序集实现.   DataRabbit 2.0使用反射机制将值在O和R之间传递,如此大量使用反射会使性能折损不少.DataRabbit 3.0在运行时,

DataRabbit 轻量的数据访问框架(06) -- IRelationAccesser

   (完全限定类名:DataRabbit.Relation.IRelationAccesser)       前面介绍的IOrmAccesser是对单表进行ORM访问,而ITableAccesser是对单表进行基于关系的访问,如果我们要进行联合查询这样的跨表搜索,则使用它们就无法达成目标.这时,你可以使用IRelationAccesser.与IOrmAccesser和ITableAccesser的针对性不同(它们针对数据库中的某个表),IRelationAccesser针对的是整个目标数据库.

DataRabbit 轻量的数据访问框架(03) -- IOrmAccesser(续)

   本文将接着 DataRabbit 轻量的数据访问框架 -- IOrmAccesser 继续介绍IOrmAccesser的一些高级功能.这些高级功能需要DataRabbit.ORM.ISmartEntity接口的支持.注意,对于Entity class 来说,该接口并不是强制的. (1)关于含自增字段的Entity插入:      插入后,Entity中对应自增字段的属性将被正确地赋为数据库中自增结果值.    如果Entity class 继承了ISmartEntity接口,那么这个Ent

DataRabbit 轻量的数据访问框架(05) -- ITableAccesser

   (完全限定类名:DataRabbit.Relation.ITableAccesser)       ORM并不能完成所有的事情,有些数据库访问还是需要基于关系来进行,对于那些不提供基于关系进行数据访问操作的纯ORM框架,我认为是不明智的.在DataRabbit中,基于ORM的访问和基于关系进行数据访问各占了一半的天空,这使得我们在无法用ORM达成的地方,可以转向使用基于关系的访问器来达成.DataRabbit.Relation命名空间下的类和接口用于提供基于关系的数据库访问操作,主要包括:

DataRabbit 轻量的数据访问框架(04) -- IEntityRelationLoader

  (完全限定类名:DataRabbit.ORM.IEntityRelationLoader)    在DataRabbit框架提供的ORM功能之中,除了IOrmAccesser接口展现的核心ORM功能外,IEntityRelationLoader接口也提供了一些有意义的功能.正如其名,IEntityRelationLoader是通过数据表的主外键关系来加载当前Entity的Parent和Children.    现在对我们前面示例经常用到的Student数据表做个扩充,假设,Student表的

DataRabbit 轻量的数据访问框架(15)-- IOrmAccesser的BatchInsert批量插入!

   DataRabbit3.0为ORM访问器提供了批量插入的功能,其方法定义如下:         /// <summary>        /// BatchInsert 批量插入一组记录.忽略所有Blob字段.        /// </summary>               void BatchInsert(IList<EntityType> entityList);     当我们需要一次性向同一Table中插入大量(如千条以上)的记录时,使用Batch

DataRabbit 轻量的数据访问框架(09) -- IDataSchemaAccesser

   (完全限定类名:DataRabbit.Schema.IDataSchemaAccesser)    在前面介绍的很多访问器的实现中,都不需要使用者提供任何关于数据库表结构的信息(比如,主键.主外键关系等),这是因为它们都借助于IDataSchemaAccesser来获取目标数据表的大纲信息,本文就来介绍如何使用DataRabbit框架中的IDataSchemaAccesser来访问和操作数据表的大纲.    我们可以从DataRabbit的入口点IDataAccesser中获取IDataS

DataRabbit 轻量的数据访问框架(10) -- IPagerManager

   (完全限定类名:DataRabbit.Core.IPagerManager)    DataRabbit框架提供了对单表查询的结果进行分页的功能,这就是IPagerManager所完成的目标.我们可以从DataRabbit的入口点IDataAccesser中获取IPagerManager引用:     PagerParameters param = ...; //构建分页参数    IPagerManager pagerManager= dataAccesser.GetPagerManag