Почему шаблон дизайна объекта запроса

Я пытаюсь понять "шаблон дизайна объекта запроса". Я не могу найти для этого хорошие и простые примеры. Может ли кто-нибудь помочь мне понять, для чего этот шаблон дизайна и в какой проблеме мы можем это реализовать?

Ответы

Ответ 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 для просмотра другая, но аналогичная реализация.

Ответ 2

Объект запроса представлял собой запрос, написанный на языке домена, и был реализацией шаблона объекта запроса. Шаблон объекта запроса, описанный Fowler, представляет собой "объект, представляющий запрос базы данных". Без какого-либо механизма запроса репозиторий будет наводнен множеством методов поиска, например, которые можно увидеть в этом фрагменте кода:

public interface ICustomerRepository     
{         
    IEnumerable<Customer> FindAll();
    IEnumerable<Customer> FindAllVIPCustomers();
    IEnumerable<Customer> FindByOrder(Guid ID);
    IEnumerable<Customer> FindAllCustomersThatHaveOutstandingOrders();
    …    
}

Вместо этого объект запроса позволяет сконфигурировать любой запрос и затем отправить его в хранилище. Основное преимущество шаблона объекта запроса заключается в том, что он полностью абстрагирует язык запросов на базовую базу данных и, таким образом, сохраняет проблемы инфраструктуры в отношении сохранения и извлечения данных из бизнес-уровня. Однако в какой-то момент необходимо создать необработанный язык запросов базы данных; это достигается с помощью QueryTranslator, специфичного для базы данных, который принимает объекты запроса и преобразует их в язык базы данных.

Из профайла Pro ASP.NET Design Patterns.