今天愉點時間,說說IUnitOfWork,它事實上是NHibernate上的東西,這里只是借一下它的思想,把咱們的EF和LinqToSql也優化一下,呵呵!對於IUnitOfWork它的中文是操作單元的意思,顧名思義,就是將多個操作放在一個單元中,把操作原子化,概念上有點像事務,但事實上並不是,它主要是指對數據庫通信來說,統一完成一次提交,這對於優化系統的性能是非常必要的,接下來,我會分5講來說明一下IUnitOfWork。
一 認識IUnitOfWork
我們一般對IUnitOfWork接口會定義如下元素:
/// <summary> /// 工作單元 /// 提供一個保存方法,它可以對調用層公開,為了減少連庫次數 /// </summary> public interface IUnitWork { /// <summary> /// 直接提交到數據庫 /// </summary> void Save(); /// <summary> /// 是否不提交到數據庫,默認值設為false,即提交到數據庫 /// 它通常於數據上下文基類去實現 /// </summary> /// <returns></returns> bool IsNotSubmit { get; set; } }
而這個接口往往由數據上下文去實現,我以entityframeworks為例,當你建立一個EDMX數據模型后,你可以再建立一個類文件來作為它的分部類,並實現IUnitWork接口,代碼如下:
namespace Domain.Entities { public partial class backgroundEntities : Domain.Core.IUnitWork { #region IUnitWork 成員 public void Save() { this.SaveChanges(); } public bool IsNotSubmit { get; set; } #endregion } }
而對於調用方來說,它通常是在具體的Repository類中去實現的,最常見的就是“構造器注入”的方式,看代碼:
事實上,在建立OrderRepository實例時,需要將實現了IUnitWork接口的數據上下文對象傳進來,然后統一進行操作。在BLL層調用DAL層時,你可以將多個DAL層的Repository對象進行組件調用,只要保證你的IUnitwork上下文對象是唯一的就可以了。
二 為什么要出現IUnitOfWork接口
對於這個問題,一句話,就是為了減少與數據庫通訊的次數,這一點在以后的課程中會着重講解的,今天就不多說了!
祝各位晚安!