DDD: Как сохранить порядок агрегатов? - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть два Агрегата: «Записная книжка» и «Примечание».

Когда я использую роль «Ссылка на агрегаты только по идентификаторам», я думаю, что у меня есть два варианта:

Notebook(List<NoteId>, [other properties])
Note([other properties])

или

Notebook([other properties])
Note(NotebookId, [other properties])

При первом варианте мне нужно два вызова БД для отображения всех заметок в блокноте (один для получения списка, а второй для загрузки заметок).

Так что мой нынешний фаворит - второй вариант. Теперь у меня есть несколько вариантов сохранить порядок заметок, где у кого-то есть недостатки.

Какой хороший подход для решения моей проблемы? Или первый вариант лучше, а два вызова БД незначительны?

Кто-нибудь может помочь?

Big THX

1 Ответ

0 голосов
/ 24 апреля 2020

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

Если нет, то почему порядок важен? Я имею в виду, что у двух сущностей есть связанный, но отдельный жизненный цикл, или, по крайней мере, он выглядит так: один агрегат - Блокнот - имеет список, который ссылается только на другой - Примечание. Следовательно, прямого взаимодействия не планируется. Но, учитывая, что домен правильно смоделирован (недостаточно информации, чтобы что-то сказать об этом), где-то вам нужен упорядоченный список заметок. Единственный способ получить его так, как вам нужно, - это сохранить информацию (или использовать уже сохраненную), в противном случае гипотеза (порядок релевантен) больше не действительна.


обновление после информации о количестве Облигаций и их размере

Похоже, что ваш домен организован следующим образом:

  • a root сущность, Блокнот, где также хранится порядок каждой Заметки, только с ее идентификатором: любое изменение в порядке будет обновляться отсюда, а не из Заметки
  • другого root сущность, Примечание, со своим собственным жизненным циклом и собственными «действиями» (операциями, которые вызывают изменение в сущности)

Всякий раз, когда вы загружаете Блокнот, вы должны также загружать Блокнот и его порядок чтобы показать это правильно упорядочено. С другой стороны, когда вы изменяете порядок, эта структура позволяет вам выполнять одно действие (или операцию) в блокноте, например changeOrder (NoteId) , которое обновляет порядок данного примечания и при необходимости меняет порядок всех остальных. Хитрость заключается в том, что когда вы сохраняете Блокнот, вы работаете только с идентификатором Заметки, поэтому вам не нужно загружать весь объект, а только его часть, обновлять и сохранять его снова. Итак, насколько велика сущность Note, не важно, потому что вы не используете все это. Следовательно, при каждом изменении вы можете инициировать обновление всех пар (NoteID, order) для этого ноутбука. Вы не можете сделать по-другому. Но, чтобы поддержать это, вам нужна одна функция в хранилище, где вы загружаете идентификатор заметки и ее порядок, и вы сохраняете ее снова; это должно быть не так дорого.

С другой стороны, все действия, которые действуют непосредственно на ноте, должны загружать ее, следовательно, вы должны загрузить все. Но в этом случае требуется загрузить все и сохранить все, потому что вы меняете саму заметку.

В любом случае, способ сохранения порядка полностью зависит от уровня постоянства, который построен над доменом. Я имею в виду, что в домене есть блокнот и набор заметок с порядком 1, 2, 3 и т. Д. c.

Даже если я не думаю, что для этого нужно такое сложное решение, вы можете использовать совершенно другой способ хранения заказа: вы можете использовать, например, шаги 100 (например, 100, 200, 300 и т. Д.). c): каждая новая заметка помещается в середине двух старых и является единственной, которая сохраняется каждый раз. Каждое время, когда вы запускаете задание или что-то еще, это просто нормализует все значения, восстанавливая 100 шагов (или все, что вы используете для сохранения порядка). Как я уже сказал, это выглядит слишком сложным решением проблемы, но также показывает тот факт, что объекты домена могут полностью отличаться от объектов Persitence.

...