使用NHibernate的DDD存储库模式

时间:2009-11-03 10:25:42

标签: nhibernate repository domain-driven-design

我很困惑。这是Ayende Rahien Repository is the new singleton的博客文章。

我认为存储库应该只执行CRUD操作而不是附加查询,否则你最终会在存储库中使用这些方法。

  1. FindCustomer(ID)
  2. FindCustomerWithAddresses(ID)
  3. FindCustomerWith ..
  4. 所以我的问题是,在哪里(在什么层)查询检索实体?

1 个答案:

答案 0 :(得分:3)

可以编写具有默认CRUD操作的存储库。例如:

public interface IRepository<TEntity>
{
   TEntity FindByIdentity(object identity);
   TEntity FindBy(Expression<Func<TEntity, bool>> specification);
   IList<TEntity> FindAll();
   IList<TEntity> FindAllBy(Expression<Func<TEntity, bool>> specification);
   TEntity Save(TEntity saveable);
   void Delete(TEntity deletable);
}

表达式&GT;基本上是规范,查询可以这种方式封装。如果我们有那种 Repository ,那么我们就不需要编写许多特定的存储库。

替代路径是创建查询对象。我们可以将该查询的接口添加到Core / Busines Logic层,并将实现添加到Services / Data层。这样我们就可以很好地命名像 AllPreferredCustomersQuery 这样的查询。它与规范非常相似,但规范不使用基础架构,因此我们可能会将其添加到Core / Business Logic层。 查询对象更具可配置性(例如可以添加限制,获取策略,连接等)。