По сути, пользователь хочет изменить изображение своего профиля.Веб-сервер получает опубликованное изображение со значением /user/35435/profile/picture
, поэтому данные должны быть сохранены, а свойство LastModification
объекта профиля обновлено.
Изображения не хранятся локально на веб-сервере, им нужнобыть загруженным в другое место (например, облачное хранилище).
В настоящий момент каждая операция представлена либо командой, либо запросом.Команды выполняются в окружающей транзакции (например, транзакция SQL).Операция загрузки изображения не является транзакционной, но в случае ошибки может быть выполнено компенсирующее действие (т. Е. Удаление изображения в случае сбоя операции БД).
В простой реализации - команда, содержащая как текущую дату, так иданные изображения созданы.Обработчик команды выполняется, он загружает агрегат ProfileAggregate
, и ProfileAggregate.updateProfilePicture(imageUploader, image, currentDate)
выполняется, передавая службу домена imageUploader
в качестве параметра.Внутри метода изображение загружается, а профиль обновляется.Обработчик команд сохраняет изменения в БД и возвращает.
Мне не нравится тот факт, что транзакция удерживается во время загрузки изображения.Мне не нравится ни выполнение операций, не связанных с моделью предметной области (например, загрузка изображения) из агрегата (даже если агрегат вызывает где-то еще).
Должно ли это взаимодействие моделироваться как две независимые команды, которые выполняютсяв последовательном порядке, или все в порядке, если что-то помещать в агрегат, если в конкретных реализациях нет никаких зависимостей.