MediatR + CQRS - использование паттернов для разделения запросов и модификаций

preview_player
Показать описание
Разработка ASP NET Core Web API с нуля профессионально. Видео 5. MediatR и CQRS

В этом видео мы узнаем о паттерне посредник, паттерне CQRS, библиотеке MediatR и продолжим разрабатывать Application уровень приложения.

Рекомендации по теме
Комментарии
Автор

Без преувеличения - у Вас одни из лучших IT-видео на рутубе!

krahmaletskrakmalets
Автор

харош не забрасывай только, лучшее что я видел, спасибо тебе от моих глаз и ушей

karmraks
Автор

Да, а я думал, что здесь научат))
В итоге сижу на десяти страницах и мониторю каждую технологию)

winstochurgle
Автор

2:06 чем аргументируется "доведение производительности приложения до максимума"? Медиатр наоборот добавляет оверхед связанный с построением цепочки обработки реквеста. Если имеется ввиду разделение на read-write хранилища, то это из другой темы...
Опять же не раскрыто зачем это нужно. Перед людьми, которые впервые слышат про CQRS и видя приведенный в видео код, встанет вопрос: "Чем это лучше CRUD-сервиса". Другие же, насмотревшись подобных уроков, пойдут распространять "Культ Карго" не понимая до конца use-case'ов при которых нужно использовать подобные паттерны.
11:00 зачем было каждое проперти из одного класса маппить вручную на другой, когда либой это все решается (можно опять обратиться к статье Богарда)? Ну и встает дискуссионный вопрос относительно необходимости интерфейса `IMapWith<T>`, поскольку, как мне кажется это смешение инфраструктурного слоя с аппликационным и засорение DTO лишними деталями.

metlic
Автор

Пару комментариев / вопросов:
1. Приятный голос и большие шрифты - то что нужно!
2. Ждем видео про DI.
3. Валидаторы появятся в проекте позже ?
4. Automapper прекрасно справляется если названия и классы полей совпадают. Зачем Вы прописывали маппинг для всех полей ? Для наглядности ?
5. Где-то можно будет скачать исходный код решения ?

Поставил лайк за Ваше видео. Спасибо Вам!

alexanderspiegel
Автор

Отлично!
И шрифт большой .
Спасибо

Ayub_Yaqub
Автор

в 12 версии MediatR return Unit.Value; при или не прокатит, типы не совпадают
чтобы повторять за автором устанавливайте 9 версию

Александр-шян
Автор

Ох, я только с маппингами разобрался, а теперь еще и медиатр и cqrs, удивительно, как я почти прошел собеседование пару лет назад не зная всего этого, знал только crud (Не попал только из-за проблем с военкоматом).
Сейчас буду куда более готовым, спасибо за курс.

Desu_Desu
Автор

удобно вкладывать класс Handler в класс команды/запроса т.к они друг без друга не имеют смысла, валидатор можно туда же. Таким образом отдельные папки не нужны и значительно меньше навигации по файлам

зачем, кстати, вручную прописывать маппинги? оно же там само маппится по конвенции

в целом, конечно, море копипасты с этим CQRS

Eugene.g
Автор

Прекрасный курс. Было бы интересно также разбор архитектурных паттернов, то как вы это видите. Я прошел курс Нестерука по паттернам проектирования, тоже прекрасный курс. С вашим подходом, я думаю будет круто. Ну или часто используемые паттерны разобрать для начала в рамках чистой архитектуры. Кроме cqrs, mediatr...

antya
Автор

мы для получения 1 сущности создали кучу папок и кучу обработчиков. Неужели нельзя просто вытащить -> замапить -> получить?

yava
Автор

А как это вы вернули Task<Unit> в UpdateNoteCommandHandler? Там же void?

redice
Автор

Такой вопрос: как правильно сделать маппинг, если есть классы-сущности Parent и Child, у Parent есть List<Child> Childs, и мне нужно сделать ParentViewModel таким, чтобы там был List<ChildViewModel>, полученный из List<Child> от Parent. Как это лучше прописать в методе Mapping класса ParentViewModel, можно ли обойтись без Select в options вызова ForMember, и если нельзя, то как обратиться к mapper внутри этого Select (достаточно ли внедрить IMapper в ParentViewModel через конструктор, или это так не работает)?

caenumplatearum
Автор

Было бы очень интересно посмотреть, как этим люди пользуются. И как это работает своими глазами.
Потому что так, вроде бы кратко. Вроде бы интересно и работает. Но непонятно

vladoss
Автор

1) Насчет Dto и Vm... Почему их назвали по разному? В каких случаях стоит именовать их тем или иным образом? Если например NoteVm на клиентской стороне будет использоваться в одном случае как часть другой ViewModel, а в другом как отдельная ViewModel. Как правильно именовать их в этом случае?
2) Если entity подразумевает наследование, например Note - базовый класс, от которого происходят штук 12 классов наследников с разными свойствами, то как правильно поступать в этом случае с командами на Update и Create? Создавать на каждый класс наследник отдельную команду или одна команда где содержатся все возможные свойства для всех наследников?

edge-of-the-world
Автор

Если поля у объектов называются одинаково, то маппер попытается их сам смапить и явно указывать это не нужно. Требуется только если не совпадают типы, вложенность или название. Или логика нужна какая-то.

Если все вручную прописывать так, то на большом проекте с огромными объектами состариться можно)

smookkee
Автор

Разве не проще профаил файлы просто прописывать и все мапы там настраивать, и никаких интерфейсов IMapWith, тогда все модельки анемичные получаются и без привязки к мапперу, а в конфигурации использовать добавление профаил классов с generic версией метода. Возможно я что то не понял

kirillkislov
Автор

11:39 Очень странно это выглядит - автомаппер может смапить эти два класса сам без дополнительного расписывания ForMember
Да и вообще вся работа с Автомаппером уж сильно усложнена для такого простого приложения.
Признавайтесь - по какой книге все это написано? :-)

Photon
Автор

Привет. У меня id прописаны не guid, a int. Как заменить эту строку Id = Guid.NewGuid() на такую же, только для инта? 5:40

АкадемияУспеха-ьэ
Автор

По коду непонятно зачем вы настраиваете ForMemeber для AutoMapper если все поля имеют одинаковый тип и названия.

yuryermolov