170 похожих чатов

Господа, есть вопрос как лучше архитектурно организовать repository model и

usecase
К примеру:
есть четыре таблички в базе
- book
- publishing
- author
- written_by

связь многие ко многим

У book и author есть свои репозитории и простые методы Get, GetList, Update, Delete

Хочется написать usecase который вытащит по автору все написанные им книжки и приджойнит к каждой книжке массив в каких годах она издавалась

Как это лучше в коде организовать?

Если в классическом ORM формате сделать модель над проскими entity то я перенесу всю реляционную логику на уровень приложения, чего хотелось бы избежать
Если сделать метод в репозитории book, который будет сторить запрос с join то кажется это нарушение solid
Если сделать view на уровне базы, то это тоже может иметь какие-то последствия для дальнейшей поддержки такого приложения, но пока не знаю каких

Есть какой-то best-practice для подобных кейсов?

14 ответов

22 просмотра

А что за таблица publishing?

Репозитории организуют вокруг аггрегата. Вам надо сперва расписать юзкейсы, исходя из них выбрать агрегат и потом для него спроектировать репозиторий. Который в целом может ходить за данными сразу в несколько таблиц. PS Если у вас связи многие ко многим, это уже флажок в пользу того что отдельных репозиториев там быть не может.

Egor-Chistiakov Автор вопроса
Roman 🎄
А что за таблица publishing?

издания книжек, Ильф и Петров написали Золотого теленка, а потом его тиражировали в разных годах разные компании

Egor-Chistiakov Автор вопроса
Anton Kucherov
Репозитории организуют вокруг аггрегата. Вам надо ...

Но разве аггрегат это не модель над несколькими плоскими сущностями хранящимися в таблице? Если я просто хочу сделать UPDATE book почему у меня не может быть отдельного репозитория над entity? ведь аггрегат может быть нужен не во всех usecase

Anton Kucherov
Репозитории организуют вокруг аггрегата. Вам надо ...

интересно, а есть примеры проектов в открытом доступе?

Egor-Chistiakov Автор вопроса
Anton Kucherov
Репозитории организуют вокруг аггрегата. Вам надо ...

и методы репозитория-агррегата могут возвращать разные модели? типа GetBook и GetAuthorsByBook будут жить в одной структуре?

Egor Chistiakov
и методы репозитория-агррегата могут возвращать ра...

У репозиториев по определению не может быть подобных методов. Репозиторий по сути это коллекция. Для выборки элемента из коллекции может использовться сложный критерий, но сути это не меняет. Хранится и извлекается из репозитория один конкретный аггрегат

Alexey
интересно, а есть примеры проектов в открытом дост...

На Go хз даже есть ли. Давно не слежу за этой темой. Но на .NET к примеру точно есть.

Egor-Chistiakov Автор вопроса
Anton Kucherov
У репозиториев по определению не может быть подобн...

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

Egor Chistiakov
Но разве аггрегат это не модель над несколькими пл...

В качестве аггрегата как правило выступает какая то сущность в рамках одного или нескольких юзкейсов. При этом надо понимать что аггрегаты и сущности могут быть описаны в коде в разных местах в разных контекстах. Т.е. если у вас есть Book сущность, это не значит что у вас на весь проект существует только одна структура Book. И вы вокруг нее строите кучу методов и функций и все рядом пихаете. Это одно из вообще самых фундаментальных заблуждений. Структур Book условных может быть много. Вплоть до того что на каждый юзкейс будет своя.

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

Код который абстрагирует сложную выборку данных конкретного аггрегата который собирается из разных таблиц и даже разных БД живет в репозитории. Собственно для этого паттерн репозиторий и нужен.

Egor-Chistiakov Автор вопроса
Anton Kucherov
В качестве аггрегата как правило выступает какая т...

Прекрасно, давайте попробуем пройти top bottom Есть контракт, который обязывает возвращать модель книжек из такой ручки /api/authors/{id}/books { "books": [{«id»: 1, author: 2, pulishing: [1900, 2020, 2022]}] } спускаясь ниже обработчк ручки может вызвать usecase u.GetBooksByAuthor(id) и если я правильно понял этот запрос будет направлен в репозиторий-аггрегат а как правильно представить его модель и интерфейс в этом случае?

Egor-Chistiakov Автор вопроса
Egor Chistiakov
Прекрасно, давайте попробуем пройти top bottom Ес...

и здесь дополнительный вопрос «со звездочкой» будут ли проблемы если вынести аггрегат во view на уровень базы или стоит варить джоины из кода?

Похожие вопросы

Обсуждают сегодня

Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
я так понимаю, я так подозреваю, что создание такого плагина для человека, кто умеет писать плагины для делфи потребует минут 5-10 времени. но это мое подозрение. хотелось бы ...
Kraszx
7
Коллеги, добрый вечер. Создаю коллекцию от TFPGMap, ключ - перечисление, значение - целое. Нужно отсортировать коллекцию по значению. Как это можно сделать?
Kirill Filippenok
11
Скажи а ты когда этот канал создавал ты уже дельфи не любил, или это со временем пришло?
Роман Лях (rgreat)
18
Привет, такой вопросик появился кажется ли вам что Rust слишком сложный/строгий для высокоуровневого программирования и слишком "безопасный"/строгий для низкоуровневого?
Крокант
10
Всем привет! Использую кастомное модальное диалоговое окошко, все по классике - mrOK, mrCancel как ModalResult. Однако есть нюанс - в главной форме есть универсальный обработч...
Олег Гранишевский
20
Карта сайта