標準架構~業務層到底是否應該關注資料持久化的方式

來源:互聯網
上載者:User

標籤:style   blog   http   color   io   os   ar   使用   strong   

業務層,你不能知道資料庫的實現細節

這個話題也是網上談論的非常多的,你的業務層是否會包含你的資料層的相關架構技術,如,你的資料層的持久化通過EF來實現,那麼你的業務層是否也應該引入EntityFrameworks程式集?佔佔還是會告訴你,不應該,因為這樣會使你的業務不再是純粹的業務,它會依賴由你的資料層的持久化實現的技術,這是不對的,我們需要把業務層解藕出來,只有這樣,你的資料層在進行技術切換時,業務層才不會受到影響,當然,這是理所當然的,如果你的資料庫換技術了,還會影響到你的業務層,那麼,你這個架構本身就是失敗的!

我的EF架構失敗了

在我的EF架構裡,業務層使用了資料層實現的entityframeworks程式集,它知道了太多持久化的方式,所以,它是失敗的,你失敗,因為你讓我無法簡單的從一種ORM切換到別一種ORM。

失敗的原因,可以理解

之所以在業務層引用entityframeworks,原因是“事務”,為了保證資料一致性,我們會在程式中加入事務塊,而有時,sql2005來說,它會將本地事務不可理解的提高為分散式交易,這對於系統來說,無疑是一種負擔,所以,我只能把這個事務塊進行重寫,重寫後使它不會觸發分散式交易,但同樣也出現了一個慘痛的代價,那就是,一個本地事務需要具體同一個“資料內容”,即entityframeworks裡的DbContext對象,所以,BLL層就這樣,依賴了EF,失敗是可以理解的。

SQL2008是美麗的

當SQLSERVER升級到2008,它似乎查覺到了什麼,可能是一種壞味道,一種代碼的壞味道,在SQL2005裡,一個語句被發到SQL端,會reset一個SQL連結,正是一個reset導致我們的net把這個過程當成是一個分散式交易來處理,而SQL2008裡,如果你的資料庫是一個,那個它就會認為,你的這個過程是一個Local session的過程,即,本地會話,本地事務!

我的貢獻

下面貢獻一下我的SQL2005同一上下文不觸發MSDTC的解決方案代碼

   /// <summary>    /// Author:zhang.zhanling    /// 同步文章:http://www.cnblogs.com/lori/p/3455393.html    /// 對TransactionScope,讓它對同一個資料庫不產生msdtc服務    /// 環境:sql2005,sql2008本身已經解決了這個問題    /// </summary>    public class TransactionScopeNoMsdtc    {        /// <summary>        /// 產生包裹事務        /// 維持一個connection連線物件        /// </summary>        /// <param name="db">資料內容</param>        /// <param name="isOutest">是否為最外層,預設為false</param>        /// <param name="action">處理代碼塊</param>        public static void UsingNoMsdtc(IUnitOfWork db, bool isOutest, Action action)        {            var objectContext = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)db).ObjectContext;            try            {                if (objectContext.Connection.State == System.Data.ConnectionState.Closed)                    objectContext.Connection.Open();                using (TransactionScope trans = new TransactionScope())                {                    action();                    trans.Complete();                }            }            finally            {                if (isOutest)//如果是最外層事務,再將串連關閉!內部事務與外部事務需要共用一個Connection的串連                    objectContext.Connection.Close(); //只能關閉,不能dispose,因為dispose之後,上下文就無法得到連結串了            }        }        /// <summary>        /// 產生包裹事務,它不是最外層的,如果是最外層的需要調用其它重載        /// </summary>        /// <param name="db"></param>        /// <param name="action"></param>        public static void UsingNoMsdtc(IUnitOfWork db, Action action)        {            UsingNoMsdtc(db, false, action);        }    }

 

標準架構~業務層到底是否應該關注資料持久化的方式

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.