Как мы можем принудительно применить эти инварианты, используя один агрегат на правило транзакции?
Есть несколько разных ответов.
Один из них - отказаться от «правила» - не важно ограничивать себя одним агрегатом на транзакцию. Что действительно важно, так это то, что все объекты в единице работы хранятся вместе, так что транзакция является событием «все или ничего».
BEGIN TRANSACTION
UPDATE ORGANIZATION
UPDATE TENANT
COMMIT
Проблема в этой схеме состоит в том, что агрегаты больше не описывают атомарные единицы хранения - тот факт, что эта организация и этот арендатор должны храниться в одном и том же сегменте, является неявным, а не явным.
Другим является изменение ваших агрегатов - границы жесткие, и часто бывает, что наш первый выбор границ неверен. Уди Дахан в своем выступлении В поисках границ обслуживания заметил, что (в качестве примера) поведение домена, связанное с книгой title , обычно не имеет ничего общего с книгой цена ; это две разные вещи, которые имеют отношение к общему, но у них нет правил общего. Поэтому их можно рассматривать как часть отдельных агрегатов.
Таким образом, вы можете перепроектировать границы вашей Организации / Арендатора, чтобы более корректно фиксировать отношения между ними. Таким образом, все отношения, которые нам необходимы для правильной оценки этого правила, находятся в одной совокупности и поэтому обязательно хранятся вместе.
Третья возможность состоит в том, чтобы признать, что эти два агрегата независимы друг от друга, и «инвариант» больше похож на руководство, чем на действительное правило. Эти два агрегата действуют как участники протокола, и мы проектируем в протокол не только счастливый путь, но и режимы отказа.
Простые формы этих протоколов, в которых мы предпринимаем обратимые действия для устранения проблемы, называются сагами. Кейти МакКаффри выступила с хорошо принятым докладом по этому вопросу в 2015 году, или вы могли прочитать Клеменс Вастерс или Бернд Рюкер ; Гарсия-Молина и Салем представили термин в своем исследовании долгосрочных транзакций .
Process Manager - это еще один общий термин для этой идеи согласованного протокола, где у вас может быть более сложный график состояний, чем commit / rollback.