天天看點

DataRabbit 輕量的ORM架構(17)-- 使用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

        public CompanyUserBEM(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"/>    

     示例的CompanyUserBL類的執行個體隻需要注入該transactionScopeFactory即可。