2010-07-02 22 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

相关问题