通用存储库。需要建议

时间:2011-02-24 16:16:30

标签: .net linq nhibernate repository repository-pattern

我正在考虑走哪条路,无法决定哪一条更好。也许你可以给我一个杀手锏:)

我的问题:我有一个建立在NHibernate之上的通用存储库。它的界面非常简单,例如Get(对象id),保存,删除等。有时这个界面工作正常,但有时却没有。例如,我项目中的几个实体有一个名为Code的属性(但不是全部)。我希望不仅可以通过主键获取实体,还可以使用此属性获取实体。另一种情况是我需要使用日期过滤某些实体,或提供特定于各个实体的其他过滤条件。目前我正在考虑以下解决方案:

  • Linq - 我可以从Repository为每种类型返回一个IQueryable对象,然后使用linq表达式过滤查询。我不喜欢这个想法,因为如果我走这条路,我看不到Repository背后的原因。
  • 特定于实体的存储库 - 在这里,我可以在通用存储库之上构建特定的实体。它将具有诸如Get(DateTime dateFrom,DateTime dateTo)等方法。缺点是我将不得不为每个实体对象创建一个存储库类。好的一面是,从数据库中持久保存/删除对象图会更容易,因为它知道实体的依赖性。
  • 请告诉我:)

5 个答案:

答案 0 :(得分:3)

鉴于您已经拥有通用存储库接口(我假设),我将使用实体特定存储库,但通过扩展通用存储库来实现它。这应该使代码更容易被发现,并允许您继续遵循您的存储库模式。这将允许您添加通过代码获取的方法以及通过传递日期范围来获取方法。

答案 1 :(得分:3)

在对通用存储库投入大量精力之后,我更喜欢特定于实体的存储库。

我的这个答案(目前为止36票)详细阐述了这一立场,并包含了一种你可以使用的方法:

Advantage of creating a generic repository vs. specific repository for each object?

答案 2 :(得分:2)

我提倡使用聚合存储库而不是实体特定的存储库。例如,如果您有实体

Project
ProjectStatus
ProjectType

将数据访问权限合并到一个存储库而不是三个单独的存储库中是有意义的。

答案 3 :(得分:0)

我使用的东西看起来像这样:注意,它的实体框架,但模型/设计可以在我想的任何地方使用。

public interface IRepository<T>
{
    T Save(T entity);
    void Delete(T entity);
    IQueryable<T> GetAll();
    T GetById(int id);
}

我从许多关于使用IQueryable的问题中选择了它,整个优点是,你可以轻松地模拟IRepository。

有关详细信息,请参阅this answer

答案 4 :(得分:0)

您可以使用命名查询来获取基于非关键列的行,或使用与sql语句非常相似的Hibernate查询语言(hql)进行任何类型的过滤。

This might help.