Чувствую себя дураком . Объясните "на пальцах" что такое агрегат. Чтоб раз и навсегда не путать понятия
Для начала - Агрегат это паттерн. Можешь юзать можешь не юзать. Если ты говоришь кому-то что не юзаешь агрегаты и он начинает смеяться - скорее всего ты общаешься с дурачком. Агрегаты имеют смысл там где важные и сложные бизнес рулы. Какой-нибудь профиль пользователя агрегатом делать тупо.
Обычно есть путаница потому что в синей книжке определение агрегата это "агрегат это некий набор доменных объекты представляющих собой единое целое". И народ радостно кричит "ееее у меня есть агрегат User" или там "агрегат продукт". А че? объекты, объединяются. В единое целое! По факту же "единое целое" = "то без чего нельзя убедиться что твои инварианты выполняются и не больше". Короч тут сложно все и к вопросу о том что люди тянутся к абстрактным терминам. Хотя Эванс другому учил но кто его читал на самом деле...
Агрегаты гарантируют консистентность стэйта имидиейт. Что бы этого добиться, нутро агрегата никогда не должно быть изменяемым снаружи. Все должно идти строго через корень (тот объект в котором все лежит). Более того, можно говорить что доступ к агрегату эксклюзивный - это партиция данных. Если у тебя есть агрегат который хотят потрогать 100 человек - все должны трогать его последовательно. По этой причине обычно рекомендуют делать агрегаты как можно более маленькими.
ну вот простой пример - есть у тебя приложение. Приложение занимается например штуками типа документооборота. И есть у тебя правило мол "документ можно опубликовать только если у тебя есть два апрува от ревьюверов". То есть у нас есть некое понятие DocumentStatus
которое может быть пендинг или паблишед, и перевести в этот статус можно только согласно условию. Для соблюдения всех правил этот объект в себе должен хранить: айдишку документа. флаг опубликовано или нет. список айдишек тех кто апрувил или же счетчик какой. В целом этого достаточно.
Дальше у объекта DocumentStatus нам нужны будут два метода - approve и publish. Первый будет запоминать что нас заапрувили. Второй - будет проверять правило и переводить в статус. Если шот не то - исключение и не меняем стэйт. Маленький и красивый агрегат. Все. больше туда ничего не пихаем. Вообще.
Агрегаты имеют смысл ТОЛЬКО НА ЗАПИСЬ. На чтение они не нужны и будут мешать (так как ты будешь пытаться больше стэйта в них пихать чем надо). На чтение у тебя нет консернов что "твое чтение приведет к неконсистентному стэйту" и как следствие можно не париться и например данные во вьюшку агрегировать какую.
когда надо париться о таких вещах: у тебя колаборативный домен со сложной логикой. Колаборативный = могут быть гонки. Ты реджектишь документ а кто-то в это время пытался его запаблишить. За счет того что "колаборативный" вопросы конкурентных действий будут заставлять тебя думать о выборе партиций и декомпозиции стэйта. В ситуации когда просто сложная логика - в этом тоже смысл есть, просто чуть меньше.
Надо ли делать всю систему на агрегатах - нет это тупо. Например изменение твоего профиля - тут нет конкуренции за ресурсами и сложной логики. Тупой круд. Можно даже по слоям не загоняться.