簡體   English   中英

Linq-To-Sql的工作單元模式與事務范圍?

[英]Unit of Work pattern vs. Transaction Scope for Linq-To-Sql?

我想模仿我的門戶應用程序中使用Linq-2-Sql在DDD中廣泛使用的Repository方法。 到目前為止我有這個:

     public class LinqToSqlDal<DC,T>: IDisposable, IRepository<T> 
        where T: LinqEntity, new(),
        where DC: DataContext, new() 
     {

              private DC unitOfWork = null;

              public LinqToSqlDal(string connectionString) 
              {
                   this.unitOfWork = Activator.CreateInstance(typeof(DC), connectionString) as DC; 
              }

               public LinqToSqlDal(string connectionString, DataLoadOptions loadOptions): this(connectionString) 
              {
                   this.unitOfWork.LoadOptions = loadOptions;
              }

              public virtual void SubmitChanges() { 
                 this.unitOfWork.SubmitChanges();
              }

              public virtual List<T> Get(Expression<Func<T,bool>> query) 
              {
                   return this.unitOfWork.GetTable<T>().Where(query);
              }

              public virtual void Delete(Expression<Funct<T, bool>> query) 
              {
                   this.unitOfWork.GetTable<T>().DeleteAllOnSubmit(this.unitOfWork.GetTable<T>().Where(query));
              }

              public virtual T GetByID<T>(Expression<Funct<T, bool>> query) 
              {
                     return this.unitOfWork.GetTable<T>().Where(query).SingleOrDefault();
              }

              public virtual object Add(T entity, string IDPropertyName) 
              {
                this.unitOfWork.GetTable<T>().InsertOnSubmit(entity);
                this.SubmitChanges();

                 var ID = (string.IsNullOrEmpty(IDPropertyName)) ? null : 
                    entity.GetType().GetProperty(IDPropertyName).GetValue(entity, null);

                   return ID;
              }

               public virtual void SubmitChanges() 
               {
                   this.unitOfWork.SubmitChanges();
               }

              public void Dispose() 
              {
                 this.unitOfWork.Dispose();
              }


     }

所以現在我可以將它與實體所屬的任何Entity和DataContext一起使用。 我的問題是 - 在這個小的存儲庫好處中傳遞或實例化TransactionScope嗎? 到目前為止,我只有一個DataContext但可以有多個前進,可以對當前設計做些什么來確保跨多個數據上下文的事務?

這是使用泛型包裝上下文並讓客戶處理它的好方法嗎?

我肯定會創建某種集中但外部控制的交易控制。 就個人而言,我贊成UnitOfWork,因為您可以將其設計為僅與存儲庫模型相關聯的抽象,而不是任何特定於實現的細節。

目前,您的工作單元是特定於實現的。 您的開發人員知道名為unitOfWork的對象實際上是Linq2SQL的DataContext。 知道這一點,他們可以完全繞過存儲庫並使用UnitOfWork進行數據庫調用。 他們這樣做是一個壞主意,但事實上他們可以建議需要更完整地將具體細節封裝在更好的摘要背后。

我會使UnitOfWork成為一個令牌類; 令牌只是一個抽象占位符,它指的是原子操作集。 在幕后,您可以使用UnitsOfWork來鍵入DataContexts的集合,並在每次通過調用方法將該令牌呈現給存儲庫時將Context用於特定的UnitOfWork(它將作為參數傳遞)。 當外部代碼丟棄UnitOfWork時,處理DataContext。 像這樣設計您的存儲庫意味着消費代碼不需要任何實現細節的知識。 如果您后來認為Linq2SQL不能滿足您的需求而您想切換到NHibernate,則更改將在Repository邊界處結束; 無論UnitOfWork是指DataContext還是ISession,您的消費代碼都不會給出飛行翻轉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM