存储库与UnitOfWork

Sib*_*Guy 0 .net nhibernate entity-framework repository unit-of-work

我目前的观点是存储库应该包含特定于实体的修改方法,如添加,删除等.而UnitOfWork应该只包含与它相关的方法,如Commit(也称为SaveChanges,SubmitChanges)和Rollback(也称为作为ClearChanges).但Martin Fowler在他关于UnitOfWork的文章中建议将所有修改方法添加到UnitOfWork中.

那么现在哪种方式更好,在EF和NHibernate的世界?

更新. 我应该注意,即使采用我更好的方法,最后通过存储库的所有修改都会进入内置于EF Context或NHibernate Session的UnitOfWork.而我的UnitOfWork更像是UnitOfWorkManager(它管理内部ORM UnitOfWork).

Dmi*_*try 6

在NHibernate世界中,UnitOfWork的主要功能由ISession实现.ISession会跟踪已更改的内容,您不需要使用RegisterClean或RegisterDirty等方法.对于较大的项目,通过使用您自己的可称为UnitOfWork的类来隐藏ISession是很有用的.例如:

public class UnitOfWork {

    private readonly ISession _session;

    public void BeginTransaction();

    public void Commit();

    public void Rollback();

    public IRepositoryFactory AllRepositories;
}
Run Code Online (Sandbox Code Playgroud)

将ISession隐藏在应用程序代码中的优点是,此代码不会直接引用NHibernate,从而实现更好的分层.换句话说,应用层将更难直接开始使用NHibernate API,绕过数据访问层.

存储库本身将包含添加新对象和可能删除的方法:

public interface IOrdersRepository {

    public IList<Order> FindPending();

    public void AddNew(Order order);

    public void Delete(Order order);
}
Run Code Online (Sandbox Code Playgroud)