我有封装对域模型的数据访问的存储库(例如 ContactRepository、UserRepository 等)。
当我在寻找数据时,例如
- 查找名字以 XYZ 开头的联系人
生日在 1960 年之后的联系人
(ETC),
我开始实现存储库方法,例如FirstNameStartsWith(string prefix)和YoungerThanBirthYear(int year),基本上遵循了许多示例。
然后我遇到了一个问题——如果我必须合并多个搜索怎么办?我的每个存储库搜索方法,例如上面的,只返回一组有限的实际域对象。为了寻找更好的方法,我开始在 IQueryable<T> 上编写扩展方法,例如:
public static IQueryable<Contact> FirstNameStartsWith(
this IQueryable<Contact> contacts, String prefix)
{
return contacts.Where(
contact => contact.FirstName.StartsWith(prefix));
}
现在我可以做一些事情,比如
ContactRepository.GetAll().FirstNameStartsWith("tex").YoungerThanBirthYear(1960);
然而,我发现自己在编写扩展方法(并且到处发明了诸如ContactsQueryableExtensions之类的疯狂类,并且通过将所有内容都放在适当的存储库中,我失去了“漂亮的分组”。
这真的是这样做的方法,还是有更好的方法来实现相同的目标?