Мы все слышали, что инъекционный репозиторий в совокупность - плохая идея, но почти никто не объясняет почему.Каковы последствия использования репозитория внутри агрегата и внутри службы домена
Я попытаюсь написать здесь все недостатки этого, поэтому мы можем измерить правильность этого утверждения.
Первое, что приходит мне в голову, - принцип единой ответственности.
Это правда, что путем введения в хранилище AR мы нарушаем SRP, потому что получение и сохранение агрегата не ответственность агрегировать себя. Но в нем говорится только о «агрегате», а не о других агрегатах. Так применяется ли она для извлечения из агрегатов репозитория, на которые ссылается идентификатор? А как их хранить?
Раньше я думал, что агрегат даже не должен знать, что в системе существует какое-то постоянство, потому что оно не должно существовать. Агрегаты могут быть созданы только для одного вызова процедуры, а затем избавиться.
Теперь, когда я думаю об этом, это неправильно, потому что агрегированный корень - это сущность, а сущность имеет смысл только в том случае, если у него есть уникальный идентификатор. Итак, зачем нам нужна уникальная идентификация, если не для сохранения? Даже если это просто упорство в памяти. Может быть, для сравнения, но, на мой взгляд, это не главная причина идентичности.
Хорошо, предположим, что мы извлекаем и сохраняем ДРУГИЕ агрегаты изнутри нашего агрегата, используя внедренные репозитории. Каковы другие последствия для нарушения СРП?
Уверен, что существует проблема с отсутствием контроля над сохраняющимися агрегатами, а извлечение - это какая-то ленивая загрузка, что плохо по той же причине (без контроля).
Из-за отсутствия контроля мы можем прийти в ситуацию, когда мы сохраняем один и тот же агрегат несколько раз, где его можно было сохранить только один раз, или один и тот же агрегат загружается сто раз, когда он может быть загружен один раз, следовательно, производительность хуже , Также может возникнуть проблема с устаревшими данными.
Эти причины практически лишают способность внедрять репозиторий в агрегат.
Вот мой главный вопрос: почему мы можем внедрить репозитории в службу домена?
Не по тем же причинам здесь применимы? Это подобно перемещению логики из совокупности в отдельную функцию и притворяется, что это что-то другое.
Если честно, когда я смотрел, чтобы написать этот вопрос, у меня не было хорошего ответа. Но после нескольких часов изучения этой проблемы и написания этого вопроса я пришел к решению. Отладка резиновой утки.
В любом случае я опубликую этот вопрос для других, имеющих те же проблемы. Конечно, с моим ответом ниже.
AR должна быть последовательной транзакцией на своем собственном уровне, и не более 2 агрегатов должны быть изменены в одной транзакции. Следовательно, AR, содержащееся в другом, никогда не будет изменено в той же транзакции, в которой он содержит AR. – plalx
Что вы подразумеваете под сделкой? Операция БД начинается и заканчивается методом repository.store, поэтому никаких изменений в других агрегатах не происходит. Или, может быть, вы имеете в виду транзакцию как прецедент? –
Обычно транзакция управляется на уровне службы приложений, а не в репозитории. Вот почему я это сказал. – plalx