У меня есть репозитории (например, ContactRepository, UserRepository и т.д.), которые инкапсулируют доступ к данным в модель домена.
Когда я искал поиск данных, например.
- найти контакт, чье имя начинается с XYZ
-
контакт, день рождения которого после 1960
(и т.д.),
Я начал внедрять методы репозитория, такие как FirstNameStartsWith (префикс строки) и 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, и я теряю "хорошую группировку", имея все в соответствующем репозитории.
Это действительно способ сделать это, или есть лучший способ достичь той же цели?