Information
- Rating
- Does not participate
- Location
- Нальчик, Кабардино-Балкария, Россия
- Date of birth
- Registered
- Activity
Specialization
Backend Developer, Application Developer
Senior
From 200,000 ₽
C#
.NET
OOP
PostgreSQL
Entity Framework
.NET Core
Microsoft SQL Server
Ну на мой взгляд это не корректно сравнивать — событие и вызов сервиса. Как вы одно другим заменяете?
Команду. Через Send().
Достаточно взять любую ситуацию с необходимостью изменения контракта.
Эмм. Вот прямо сейчас в текущем проекте проверил. Убрал хендлер.
Ну простой пример, первый пришедший в голову.
Имеем данные и сервис-валидатор, описанный контрактом:
Ничего необычного. Используем тоже по простому:
И теперь нам понадобилось сделать валидацию асинхронной (ну не подумал никто об этом заранее, бывает).
Для этого нам надо переделать и контракт и реализацию и все места, где сервис используется.
В случае с MediatR мы бы просто вызвали бы "какой-то" обработчик, передав ему SomeData. Никаких контрактов сервиса не нарушаем (его просто нет, либо он внутренний для хендлера). Ничего по коду меняем. Более того, можно по окончанию валидации запустить какой-нибудь общий ивент.
Что бы меньше связей отслеживать при изменениях.
Можно провести аналогию с микросервисами, которые общаются через брокер (RabbitMq, Kafka и т.п.).
Один микросервис постит сообщение (запрос или команду) в брокер, не зная кто его будет обрабатывать. А обрабатывать его будет "кто-то". И вот этого "кто-то" можно в любой момент поменять. Даже никаких контрактов соблюдать не надо. Главное уметь обрабатывать запрос.
Ну эта штука помогает сделать так, что контроллер будет общаться с любыми сервисами не зная о том кто они.
Да, можно сделать интерфейс сервиса и отдать контроллеру.
Один интерфейс, ещё один, потом ещё парочку.
Или сказать всем контроллерам "работай только через этот сервис" и "используя вот эти DTO (request)".
А вот реализации уже могут лежать где угодно.
С одной стороны свобода действий. Но с другой — вероятность хаоса (хендлеры разбросаны повсюду). Поэтому важно правильно организовать процесс. У нас примерно так:
В таком варианте CTRL+CLICK по запросу и сразу виден его хендлер.
Но подходит только для схемы "один запрос, один хендлер".
Ну и плюс ивенты. Бывает удобно.
А ещё может понадобиться для всех хендлеров добавить одну общую обработку. Логгирование как пример, но может какой-то обработчик ошибок или спец. валидатор.
В общем штука интересная для проектов с кучей контроллеров.
Для проектов попроще добавляет больше boilerplate кода.
Этого достаточно для дальнейшего использования без создания ИП?
Такое ощущение, что письмо коснулось тех кто не ИП, но включил оплату в настройках.
Я вот не ИП и оплаты у меня нет. Хотя она была где-то очень-очень давно включена в недрах AppEngine для тестов, когда Firebase еще не был куплен гуглом.
Письмо не приходило.