DDD~基礎設施層~續

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   os   io   資料   

回到目錄

在之前寫的DDD~基礎設施層文章中,提到了UnitOfWork,它裡面有一些方法,但經過項目證明,不應該有Save和IsExplicitSubmit,而這個工作單元只起到了資料內容統一的作用,如A和B對象需要在同一個上下文中工作,這時,我們可以引用工作單元的概念,而對於儲存和提交操作,還是應該在局部方法裡完成的。

為了不去觸發MSDTC,我會封裝一個特殊的事務,來實現這個工作,而對於SQL2008來說,可以直接使用.net自己的TransactionScope實現,對於同一個資料庫來說,它不會被提升為分散式交易,而SQL2008以下的版本,則需要使用佔佔封裝的事務,代碼如下:

    /// <summary>    /// Author:zhang.zhanling    /// 同步文章:http://www.cnblogs.com/lori/p/3455393.html    /// 對TransactionScope,讓它對同一個資料庫不產生msdtc服務    /// </summary>    public class TransactionScopeNoMsdtc    {        /// <summary>        /// 產生包裹事務        /// 支援LINQ表提交,並同時返回提交結果到實體        /// </summary>        /// <param name="db">資料內容,多個方法使用的上下文必須是同一個</param>        /// <param name="isOutermost">是否為最外層,預設為false</param>        /// <param name="action">處理代碼塊</param>        public static void UsingNoMsdtc(DbContext db, bool isOutermost, 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())                {                    try                    {                        action();                        trans.Complete();                    }                    catch (Exception)                    {                        throw;                    }                    finally                    {                        trans.Dispose();                    }                }            }            catch (Exception)            {                throw;            }            finally            {                if (isOutermost)//如果是最外層事務,而將串連關閉                {                    objectContext.Connection.Close();                }            }        }        /// <summary>        /// 產生包裹事務,它不是最外層的,如果是最外層的需要調用其它重載        /// </summary>        /// <param name="db">資料內容,多個方法使用的上下文必須是同一個</param>        /// <param name="action">處理代碼塊</param>        public static void UsingNoMsdtc(DbContext db, Action action)        {            UsingNoMsdtc(db, false, action);        }    }

而最新的IUnitOfWork介面就變成了一個標識介面,代碼如下

    /// <summary>    /// 資料內容標識介面,它對於業務層應該是公開的    /// 它對於實現內容相關的方法,它並不關心,可以是linq2sql,ef,ado.net,nhibernate,memory,nosql等    /// </summary>    public interface IUnitOfWork    {    }

我們看到,IUnitOfWork主要作用是標示各個倉儲在同一個上下文當中,或者說,在一個工作單元之中,下面是項目中使用的代碼,我們可以參考一下

    /// <summary>    /// Point_Info倉儲    /// </summary>    /// <remarks>create:cyr_(Ben)_20131128</remarks>    public class Point_InfoRepository : TsingDa_NewLearningBarRepository<Point_Info>    {        #region Constructors        public Point_InfoRepository() : this(null) { }        public Point_InfoRepository(IUnitOfWork db) : base(db) { }        #endregion    }

我們可以看到,上面的倉儲提供了兩個構造方法的實現,預設為空白參,還有一個可以為它傳入一個IUnitOfWork工作單元,本倉儲也支援IoC的構造方法注入。

回到目錄

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.