說(shuo)說(shuo)IUnitOfWork~認(ren)識IUnitOfWork,為什么(me)要出現IUnitOfWork接口
今天愉點(dian)時間,說(shuo)說(shuo)IUnitOfWork,它事(shi)實上(shang)(shang)(shang)是(shi)(shi)NHibernate上(shang)(shang)(shang)的(de)(de)東西,這(zhe)里(li)只(zhi)是(shi)(shi)借一(yi)下它的(de)(de)思(si)(si)(si)想,把咱們的(de)(de)EF和LinqToSql也優化一(yi)下,呵(he)呵(he)!對(dui)于(yu)IUnitOfWork它的(de)(de)中文是(shi)(shi)操作單(dan)(dan)元的(de)(de)意思(si)(si)(si),顧(gu)名思(si)(si)(si)義,就(jiu)是(shi)(shi)將多個操作放在(zai)一(yi)個單(dan)(dan)元中,把操作原子化,概念上(shang)(shang)(shang)有點(dian)像事(shi)務,但事(shi)實上(shang)(shang)(shang)并不是(shi)(shi),它主要(yao)是(shi)(shi)指對(dui)數(shu)據庫通信來說(shuo),統(tong)一(yi)完成一(yi)次提交(jiao),這(zhe)對(dui)于(yu)優化系統(tong)的(de)(de)性能(neng)是(shi)(shi)非常(chang)必(bi)要(yao)的(de)(de),接下來,我(wo)會分5講來說(shuo)明(ming)一(yi)下IUnitOfWork。
一 認識IUnitOfWork
我(wo)們一般(ban)對IUnitOfWork接口會定義如下元素:
/// <summary> /// 工作(zuo)單(dan)元 /// 提供一個保(bao)存方(fang)法,它可以對調(diao)用層(ceng)公開,為了(le)減少連庫次數(shu) /// </summary> public interface IUnitWork { /// <summary> /// 直接提交到(dao)數據(ju)庫(ku) /// </summary> void Save(); /// <summary> /// 是否不提交到數據庫,默認值設為false,即(ji)提交到數據庫 /// 它通常于數據上下文基類去實現 /// </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 } }
而(er)對于調用方來說,它通常是在具體的Repository類中(zhong)去實現的,最常見的就是“構造器注入”的方式(shi),看代(dai)碼:
事實(shi)上,在(zai)建立OrderRepository實(shi)例(li)時,需要將實(shi)現(xian)了IUnitWork接口的(de)數據上下(xia)文對(dui)象(xiang)(xiang)傳進(jin)來,然(ran)后統一(yi)(yi)進(jin)行(xing)操作。在(zai)BLL層調用DAL層時,你可以將多個DAL層的(de)Repository對(dui)象(xiang)(xiang)進(jin)行(xing)組件調用,只要保證(zheng)你的(de)IUnitwork上下(xia)文對(dui)象(xiang)(xiang)是唯一(yi)(yi)的(de)就可以了。
二 為什么要出現IUnitOfWork接口
對于這個(ge)問題,一(yi)句話,就是(shi)為了減少與(yu)數據庫通(tong)訊的(de)次數,這一(yi)點在以后的(de)課程中會著重講(jiang)解的(de),今天就不多說了!
祝各位晚安!