Проксирование запроса в cqrs приложениях

114
12 июня 2019, 05:10

Пишу тестовый веб-сайт, где пробую разные аспекты CQRS (сначала это была самопальная реализация cqrs, потом попробовал MediatR).

И вот что меня интересует. Насколько принято делать запросы составными, вызывая из одного запроса другой?

У меня вот есть два близких запроса:

построить отчёт за месяц

public class MonthReportQuery : IRequest<MonthReportDto>
{
    public int Year { get; set; }
    public int Month { get; set; }
}

построить отчёт за год

public class YearReportQuery : IRequest<YearReportDto>
{
    public int Year { get; set; }
}

На выходе я получаю один и тот же набор данных отчёта, форма одинакова и различия только в шапке отчёта. Один раз требуется знать и месяц и год:

public class MonthReportDto
{
    public int Year { get; set; }
    public int Month { get; set; }
    ... (малозначительные подробности)
    public IEnumerable<ReportItemDto> Report { get; set; }
}

а другой раз - только год:

public class YearReportDto
{
    public int Year { get; set; }
    ... (малозначительные подробности)
    public IEnumerable<ReportItemDto> Report { get; set; }
}

В каждом случае у меня абсолютно одинаковая логика собственно запроса, который черпает данные из базы и принимает на вход среди прочего период: DateTime startDate, DateTime endDate

Какие я вижу способы выстроить аккуратно структуру классов и поменьше дублировать код:

  • Создать один запрос PeriodReportQuery и не включать в ответ входные данные.
  • Оставить два запроса, но отнаследовать их от абстрактного класса ReportBaseQuery в который снести одинаковую логику (выборка из базы)
  • Создать ТРИ запроса (на месяц, на год, на период), при этом запросы на месяц и год будут вызывать запрос "выборка за период".

И вот сейчас я остановился на варианте с двумя запросами и базовым классом, но всё думаю, насколько жизнеспособен вариант с тремя запросами.

Возможно, в данном случае он не особо и подходит для ситуации, но может быть подобное вообще бывает нужно в приложениях построенных на базе cqrs? Сам я подобного не читал, поэтому не имею опыта.

READ ALSO
Как удалить подсветку Label в Menu?

Как удалить подсветку Label в Menu?

В меню вставлен LabelПодсвечивается голубым цветом

176
Как использовать select с массивами в c# (mysql)?

Как использовать select с массивами в c# (mysql)?

У меня имеется база данных и мне надо отсортировать данные в нейЯ создал массив строк и хочу сравнить их с нужным столбцом в каждой строке...

144
Как узнать внешний IP-адрес клиента?

Как узнать внешний IP-адрес клиента?

Можно ли узнать с каким IP пользователь выходит в глобальную сеть? Использование сервисов не вариант потому, что например если он использует...

118
Как сделать подгрузку файлов игры с сервера при запуске на андроид?

Как сделать подгрузку файлов игры с сервера при запуске на андроид?

Дайте пожалуйста направление как загружать файлы с сервера при запуске игры, чтобы в будущем можно было добавлять/менять фон, музыку и тд

196