Не слишком ли часто в примерах CQRS в Интернете используется библиотека MediatR?C#

Место общения программистов C#
Anonymous
Не слишком ли часто в примерах CQRS в Интернете используется библиотека MediatR?

Сообщение Anonymous »

Я изо всех сил пытаюсь понять, почему так много примеров в Интернете используют MediatR при объяснении шаблонов CQRS, при работе с командами и запросами.
Почти везде я вижу примеры, где команды и Запросы обрабатываются MediatR, но я не вижу в этом никакой пользы, кроме отсутствия необходимости регистрировать каждую команду или запрос в контейнере внедрения зависимостей. Но затем вам необходимо реализовать объекты Query (наследующие IRequest), объекты Query Handlers и Query Responses, чтобы в вашем методе контроллера API вы могли затем вызвать _mediatr.Send(queryObject).
Почему бы просто не использовать внедрение зависимостей для внедрения объекта запроса в контроллер API, на котором вы можете напрямую вызывать методы «get»? Нравится:

Код: Выделить всё

[HttpGet]
[Route("getall")]
public async Task GetAll(int page = 0, int pageSize = 25)
{
var result = await _incidentQueries.GetIncidents(page, pageSize);
return result;
}
вместо:

Код: Выделить всё

[HttpGet]
[Route("getall")]
public async Task GetAll(int page = 0, int pageSize = 25)
{
var query = new IncidentQuery(page, pageSize);
var result = await _mediatr.Send(query);
return result;
}
Затем внутри метода GetIncidents выполняется прямой SQL-вызов базы данных и сопоставление результатов с объектами C#. Просто и понятно.
Для меня идеальное и единственно разумное использование библиотеки MediatR — это обработка событий домена.
При реализации DDD я Я пытаюсь создать проект, как показано ниже. Каждый прямоугольник представляет собой отдельный проект в решении. Стрелки обозначают ссылки:
Изображение
Представим себе сценарий: для создания объекта домена необходимо увеличить счетчик, хранящийся в другом объекте домена (другой агрегат).
  • Запрос создается для конечной точки API для добавления нового объекта домена в базу данных (уровень 6: презентация)
  • Метод контроллера использует команду, внедренную в его конструктор, для создания объект домена (уровень 4: Команды)
  • Внутри команды создается новый объект домена вместе с событием «объект создан», хранящимся в этом объекте, готовый будет транслироваться непосредственно перед сохранением в базу данных.
  • Затем команда использует репозиторий из уровня инфраструктуры, чтобы добавить этот вновь созданный объект в базу данных.
  • Затем непосредственно перед выполняется сохранение базы данных: событие «создание объекта домена» отправляется через MediatR (уровень 2: инфраструктура)
  • Затем событие перехватывается на слое 3: Приложение в одном из обработчиков событий домена.
  • Обработчик событий домена (уровень 3: Приложение) использует репозиторий из уровня инфраструктуры для получения другой домен. Агрегат содержит счетчик, который необходимо увеличить, а затем увеличивает счетчик.
  • Все события домена обработаны, выполняется сохранение в базу данных.
Поэтому MediatR для меня работает только на уровне Инфраструктура и Приложение.
Люди просто используют MediatR для команд и запросов только ради их использования? На мой взгляд, добавление команд и обработчиков запросов, запросов и типов команд и ответов только добавляет больше кода, который не имеет реальной ценности, и только делает его менее понятным.
Вот несколько ссылок, которые я посетил: Это также есть на многих сайтах на моем родном языке.< /p>
Из-за слишком большого количества обработчиков в вашем приложении сложно понять, что делает ваше приложение и что инициирует. Я увидел, что люди обрабатывают события домена на уровне команд, но домен, вероятно, не должен отправлять команды напрямую?
Нужно ли вообще использовать MediatR в CQRS?

Подробнее здесь: https://stackoverflow.com/questions/665 ... on-the-web

Вернуться в «C#»