Я просматривал разные CQRS samples
, и большинство из них используют обработчики команд, которые не сохраняют UnitOfWork
(то есть DataContext
в случае Entity Framework
). Что-то вроде этого:Почему обработчики команд CQRS исключают сохранение UnitOfWork?
public void Handle(Command message)
{
var course = Mapper.Map<Command, Course>(message);
_db.Courses.Add(course);
}
Сохранение (и фиксация транзакции) обычно происходит в фоновом режиме при обработке запроса.
Я видел этот подход у многих ведущих парней CQRS, но я никогда не слышал его рассуждений.
Самой большой проблемой такого подхода являются случаи, когда вам нужно получить идентификатор объекта сразу после вызова обработчика (что происходит довольно много). Там, очевидно, есть способы обходного пути (например, использование Guid, предварительный запрос уникального идентификатора из вашей базы данных и т. Д.), Но кажутся неуклюжими.
Но каковы преимущества этого подхода? Теоретически это могло бы помочь не делать несколько обращений к базам данных в случае, если у нас есть несколько обработчиков на запрос. Но этого не происходит. Еще одно преимущество, которое приходит мне на ум, заключается в том, что нам не нужно вводить эту рутину «Сохранить вызов», и пусть это произойдет автоматически. Это любопытно, но имеет ли он избыточный вес проблемы генерации Id?
Я чувствую, что все это имеет немного больше смысла с репозиториями. Когда мы напрямую работаем с DataContext, мы не работаем с доменом, мы модифицируем хранилище данных.И тогда мы не делаем последний шаг (сохраняя то, что мы изменили), и делаем вид, что мы разобрались в манипулировании доменными объектами и работе с хранилищем данных. – SiberianGuy