標籤: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); } }
標準架構~業務層到底是否應該關注資料持久化的方式