Я новичок в концепции DDD и CQRS и не могу найти окончательного решения, как загружать изображения или файлы в целом чистым способом.
Представьте себе следующий сценарий: На онлайн-портале есть формуляр запроса на поддержку, к которому можно прикрепить файл (изображение указано c). Опубликованные данные поднимут CreateSupportRequestCommand
. Затем необходимые агрегаты будут загружены и изменены.
У меня есть три идеи, чтобы решить эту проблему, но я не очень доволен ими.
Способ 1:
1. Разместите все данные, включая изображение (составное) в одном запросе
2. Создайте FileUploadCommand
, который возвращает FileUploadId
.
3. После этого создайте CreateSupportRequestCommand
и передайте FileUploadId
с данными root в конструкторе.
Недостаток: один запрос вызовет две команды. С точки зрения CQRS одно взаимодействие с пользователем должно быть только одной командой.
Способ 2:
1. Разместите изображение в отдельной конечной точке, создайте временный файл и верните идентификатор или дескриптор файла.
2. Разместите формуляр с помощью прикрепленный идентификатор временного файла.
3. Вызвать CreateSupportRequestCommand
со всеми данными root, включая дескриптор файла, который указывает на физический файл.
4. Внутри команды сохранить временный файл в агрегат FileUpload
( FileUploadRepository
), затем
5. Создайте агрегат SupportRequest
, присвойте FileUploadId и сохраните его.
Недостаток: я работаю с 2 агрегатами в одной команде. Создание запроса в службу поддержки не несет ответственности за загрузку файла.
Способ 3: 1. Отправьте изображение в отдельную конечную точку, создайте временный файл и верните идентификатор или дескриптор файла.
2. Разместите формуляр с приложенным идентификатором временного файла.
3. Вызовите CreateSupportRequestCommand
со всеми данными root, включая дескриптор файла, который указывает на физический файл.
4. Сохраните только root данные в совокупность SupportRequest
. Поднимите SupportRequestCreatedEvent
и присоедините файловый дескриптор.
5. Внутри процесса обработки и назначьте файловый дескриптор.
Недостаток: SupportRequestCreatedEvent
действительно не должен заботиться о файловом дескрипторе.
Есть ли лучший способ решить эту проблему?