Ответ 1
Шаблон проектирования запроса обычно используется в сочетании с шаблоном проектирования репозитория.
Давайте рассмотрим пример, а затем прочитаю хорошую статью. Скажем, у нас есть база данных, где мы храним информацию о наших клиентах и их заказах и т.д.
Затем мы создаем исходный репозиторий следующим образом:
class CustomerRepository() {
Customer GetById(int id) { // implementation }
void DeleteCustomer(int id) { // impl }
void GetCustomerWithOrder(int orderId);
void GetCustomersWithOrdersMoreThan(int numberOfOrders);
}
Как вы можете видеть, для каждого запроса мы создали метод в репозитории, который очень хорош и хорош для ограниченного числа запросов, но когда у нас их много, и они начинают усложняться с помощью множества комбинаций (например, получить меня клиенты с покупками, которые превышают 1000 и живут в Нью-Йорке, а их кредитный лимит составляет менее 3000), тогда мы получим длинный список методов и, что еще хуже, пропустим некоторую бизнес-логику в форме запросов внутри хранилищ, которые мы надеваем "Не хочу быть.
Итак, чтобы реорганизовать, что мы меняем репозиторий на что-то вроде этого:
class CustomerRepository() {
Customer[] Get(Query query) { // implementation }
void DeleteCustomer(int id) { // impl }
}
Как вы можете видеть, мы передаем объект запроса, который представляет наш запрос в форме объекта, и репозиторий имеет один и только репозиторий для выполнения этого запроса и возвращает нам результаты.
Теперь, как реализовать этот объект запроса и как его построить, потребуется много кода, поэтому в этот момент я перенаправляю вас на этот nice статья. Он находится в С#, но вы найдете его очень полезным, также вы можете посмотреть API критериев (Java), который используется NHibernate для просмотра другая, но аналогичная реализация.