zoukankan      html  css  js  c++  java
  • 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 轻量的数据访问框架 -- 序 

         

  • 相关阅读:
    paip.提升性能并行多核编程哈的数据结构list,set,map
    paip.网页右键复制菜单限制解除解决方案
    paip.java swt 乱码问题解决
    paip.哈米架构CAO.txt
    paip.提升性能协程“微线程”的使用.
    paip.最省内存的浏览器评测 cah
    paip.云计算以及分布式计算的区别
    paip.提升性能string split
    paip.提升分词准确度常用量词表
    paip.提升中文分词准确度新词识别
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/1310195.html
Copyright © 2011-2022 走看看