CQRS и DDD: загрузка файлов - PullRequest
       64

CQRS и DDD: загрузка файлов

0 голосов
/ 28 января 2020

Я новичок в концепции 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 действительно не должен заботиться о файловом дескрипторе.

Есть ли лучший способ решить эту проблему?

1 Ответ

2 голосов
/ 29 января 2020

Я не думаю, что обработка загрузки файлов - это проблема домена. Метаданные файла, такие как FileContentId, могут быть частью вашего домена, но не фактической загрузки файла. Я бы выполнил файловую операцию до выполнения CommandHandler. Возможно, в промежуточном программном обеспечении или, возможно, перед очередью Command на шину сообщений.

CreateSupportRequestCommandHandler будет тогда вызывать operation, как CreateSupportRequest, для вашего совокупного значения (скажем, SupportRequest). В этом методе CreateSupportRequest все ваши бизнес-правила будут сохранены для операции. SupportRequest тогда в конечном итоге будет сохранен в вашем хранилище.

...