Я изучаю DDD и гексагональную архитектуру, я думаю, что у меня есть основы. Однако есть одна вещь, которую я не знаю, как решить: как я показываю данные пользователю?Отображение данных в пользовательском интерфейсе в гексагональной архитектуре
Так, например, у меня есть простой домен с сущностью Worker с некоторой функциональностью (некоторые методы заставляют сущность меняться) и WorkerRepository, чтобы я мог продолжать Рабочие. У меня есть прикладной уровень с некоторыми командами и командной шиной для управления доменом (например, создание Рабочих и обновление их рабочих часов, сохранение изменений) и уровень инфраструктуры, который имеет реализацию WorkerRepository и приложения GUI.
В этом приложении я хочу показать всем работникам некоторые данные и изменить их. Как показать данные?
- Я мог бы дать ему ссылку на реализацию WorkerRepository. Я думаю, что это нехорошее решение, потому что таким образом я мог бы добавить новых рабочих в репозиторий, пропустив командную шину. Я хочу, чтобы все изменения проходили через командную шину.
- Итак, я бы разделил WorkerRepository на WorkerQueryRepository и WorkerCommandRepository (в соответствии с CQRS) и давал ссылку только на WorkerQueryRepository. Это все еще не очень хорошее решение, потому что репо возвращает объекты Worker, у которых есть методы, которые изменяют их, и как эти изменения будут сохраняться?
- Должен ли я создать два типа репозиториев? Один из них будет использоваться на уровне домена и приложения, а другой будет использоваться только для предоставления данных во внешний мир. Второй из них не будет возвращать полнофункциональные объекты Worker, только WorkerDTO, содержащие только данные, необходимые графическому интерфейсу. Таким образом, GUI не имеет другого способа изменить Рабочих, только через командную шину.
Является ли третий подход правильным путем? Или я ошибаюсь, что изменения должны проходить через командную шину?
Теперь я понимаю, что я слегка неверно истолковал CQRS, но ваш ответ прояснил это. И спасибо, что подтолкнули меня в правильном направлении с прогнозами и прочитали модельные заводы! – bhaclash
«Вы читаете текущее состояние из книги записи (через репозиторий)» ... Это не то, что CQRS вообще. CQRS означает независимые чтения и модели записи. Если вы не обходите модель домена полностью для запросов, то они связаны и не могут развиваться полностью независимо друг от друга. Я не говорю, что создание DTO из модели домена обязательно плохое, но тогда вы не можете сказать, что используете архитектуру CQRS. – plalx