2010-07-02 48 views
5

在過去的一週左右,我一直在閱讀大量關於存儲庫模式的文章和教程。許多文章將存儲庫模式與工作模式緊密聯繫在一起。在這些文章中,我經常發現類似這樣的代碼:存儲庫和工作單元 - 哪個負責?

interface IUnitOfWork<TEntity> 
{ 
    void RegisterNew(TEntity entity); 
    void RegisterDirty(TEntity entity); 
    void RegisterDeleted(TEntity entity); 

    void Commit(); 
    void Rollback(); 
} 

interface IRepository<TKey, TEntity> 
{ 
    TEntity FindById(TKey id); 
    IEnumerable<TEntity> FindAll(); 

    void Add(TEntity entity); 
    void Update(TEntity entity); 
    void Delete(TEntity entity); 
} 

class Repository : IRepository<int, string> 
{ 
    public Repository(IUnitOfWork<string> context) 
    { 
     this.context = context; 
    } 

    private IUnitOfWork<string> context; 

    public void Add(string entity) 
    { 
     context.RegisterNew(entity); 
    } 

    public void Update(string entity) 
    { 
     context.RegisterDirty(entity); 
    } 

    public void Delete(string entity) 
    { 
     context.RegisterDeleted(entity); 
    } 

    /* Entity retrieval methods */ 
} 

上午我理解正確的工作目標的單位是爲了處理在底層數據存儲的任何對象的添加,更新或刪除(在我的情況,我通過LDAP與目錄服務通信)?如果這是真的,它不應該處理任何對象的檢索嗎?爲什麼這不是建議的UoW界面的一部分?

回答

4

A Repository負責數據的獲取,更新和其他CRUD操作,提供持久性的無知。

一個Unit Of Work(UOW),作爲馬林福勒說:

維護受商業交易對象的列表,並協調寫出的改變和併發性問題的解決。

uow將協調對象上的多個操作 - 它可能會也可能不會使用存儲庫來保存這些更改。

+0

所以,當調用方法'Repository.Add(obj)'時,這個改變被註冊到工作單元的對象中。然後,當調用'unitOfWork.Commit()'時,Repository從工作單元中檢索待執行的操作並執行它們? – 2010-07-02 14:17:34

+0

@Justin R. - 聽起來很正確,但細節可能取決於實施。 – Oded 2010-07-02 14:20:06

+0

如果提交更改的邏輯位於資源庫對象中,並且工作單元只是跟蹤未決更改,那麼工作單元如何與簡單的未完成更改集合有什麼不同?爲什麼它會有自己的提交/回滾方法(如Martin Fowler的UoW界面中所述)? – 2010-07-02 14:28:06

相關問題