仓库方法 vs. 扩展IQueryable

21 浏览
0 Comments

仓库方法 vs. 扩展IQueryable

我有一些仓库(例如ContactRepository,UserRepository等),它们封装了对领域模型的数据访问。

当我在搜索数据时,例如:

  • 查找名字以XYZ开头的联系人
  • 出生年份在1960年之后的联系人(等等)

我开始实现一些仓库方法,例如FirstNameStartsWith(string prefix)YoungerThanBirthYear(int year),基本上遵循了许多现有的例子。

然后我遇到了一个问题 - 如果我必须组合多个搜索条件怎么办?我的每个仓库搜索方法(如上所述)只返回有限的一组实际领域对象。为了寻找更好的方法,我开始在IQueryable上编写扩展方法,例如:

public static IQueryable FirstNameStartsWith(
               this IQueryable contacts, String prefix)
{
    return contacts.Where(
        contact => contact.FirstName.StartsWith(prefix));
}        

现在我可以做像这样的事情:

ContactRepository.GetAll().FirstNameStartsWith("tex").YoungerThanBirthYear(1960);

然而,我发现自己在各处编写扩展方法(并发明了一些疯狂的类,例如ContactsQueryableExtensions),我失去了通过将所有内容放在适当的仓库中而获得的"良好分组"。

这样做真的是正确的方法吗?还是有更好的方法来实现相同的目标?

0