Доменные сервисы, похоже, требуют лишь небольшую часть от общего числа запросов, определенных в репозиториях. Как это решить? - PullRequest
0 голосов
/ 09 декабря 2018

В настоящее время я сталкиваюсь с некоторыми сомнениями относительно слоев и репозиториев.

Я думал о создании своих репозиториев в модуле персистентности.Эти репозитории наследуют (или внедряют / расширяют) из репозиториев, созданных в модуле уровня домена, сохраняя «постоянную независимость».

Проблема заключается в том, что, насколько я вижу, потребности уровня домена в отношении егохранилища довольно скромные.В общем, они, как правило, довольно CRUDish.

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

Таким образом, возникает вопрос о том, как с этим справиться:

1) Должен ли я просто оставить интерфейсы репозитория домена простыми, а затем просто добавить дополнительные методы в репозиторийреализации (такие, что прикладной уровень, который знает о реализациях репозитория, может использовать их)?2) Должен ли я просто добавить эти методы в реализации репозитория на уровне домена?Думаю, нет.3) Должен ли я создать еще один набор репозиториев, которые будут использоваться только на уровне приложений?Это, вероятно, означало бы переход на более приложение CQRSesque.

Спасибо

Ответы [ 3 ]

0 голосов
/ 10 декабря 2018

Прикладной уровень не должен знать об инфраструктуре.

Обычно он должен нормально работать только с теми интерфейсами репозитория, которые объявлены в Домене.Конкретные реализации внедряются во время выполнения.

Объявление интерфейсов репозитория на уровне домена касается не только их использования в доменных службах, но и в других местах.

Должен ли я создать другой набор репозиториевиспользоваться только на уровне приложений?Это, вероятно, означало бы переход на более приложение CQRSesque.

Вы могли бы сделать это, но потеряли бы возможность повторного использования.

Это также не связано с CQRS - CQRS является вертикальнымразделение всего приложения между запросами и командами, не давая горизонтальным слоям разных способов извлечения данных.

0 голосов
/ 11 декабря 2018

Учитывая, что хранилище - это не запросы, а работа с полными агрегатами большую часть времени, возможно, вы могли бы уточнить, почему вам может потребоваться создать отдельный набор хранилищ, которые используются только на уровне приложений / интеграции?

Возможно, вам нужна конкретная для чтения реализация, оптимизированная для извлечения данных:

Это, вероятно, означало бы переход на более приложение CQRSesque

ХорошоВы, вероятно, захотите реализовать специфичные для чтения биты, которые имеют смысл.У меня обычно есть доступ к данным, разделенный пространством имен, а иногда даже отдельной сборкой.Затем я использую I{Aggregate}Query реализации, которые возвращают соответствующие биты данных в максимально простом виде.Однако вполне возможно даже отобразить более сложную модель чтения, которая даже имеет отношения, но она все еще только модель чтения и не связана с какой-либо обработкой команд.С этой целью домен даже не знает об этих классах.

Я бы не стал расширять репозитории.

0 голосов
/ 10 декабря 2018

Я думаю, что вы должны реагировать на реалии вашего бизнеса / требований.

То есть, если ваши варианты использования явно не являются "независимыми от настойчивости", тогда не держитесь за это конкретное ограничение.Не все может быть сведено к CRUD.На самом деле я думаю, что большинство вещей, которые стоит реализовать, нельзя свести к постоянству CRUD.В настоящее время большинство систем баз данных имеют реляционные или иные особенности, и кажется странным просто игнорировать их.Используйте их.

Если вы не хотите смешивать SQL с другим кодом, есть еще много других «шаблонов», которые позволяют вам это делать, не требуя абстрагировать доступ к тому, чего вы на самом деле не делаетенужна абстракция к.

С другой стороны, вы строите зависимость от конкретной персистентной системы.Это проблема?В большинстве случаев это не так, но вы должны решить сами.

В общем, я бы выбрал вариант 4: смоделировать проблему.Если мне нужен сложный SQL для построения сценария использования, и мне не нужна независимость от базы данных (я редко, если вообще когда-либо), то просто напишите его там, где он используется, конец истории.

Вы можетеиспользуйте другие инструменты, такие как рефакторинг позже, чтобы исправить проблемы проектирования.

...