Я пытаюсь использовать доменный дизайн при создании общедоступного веб-сайта. Одна из проблем, с которыми я сталкиваюсь, - это попытаться выяснить, какими должны быть совокупные корни для моей модели. У меня есть довольно хорошее представление о том, какие объекты являются объектами сущностей и какие объекты являются объектами значений.
Мой сайт, как и большинство общедоступных сайтов, не позволяет каждому пользователю видеть каждую информацию, хранящуюся на сайте. Вместо этого они могут видеть только информацию, которой они владеют. В случае моего сайта пользователи будут создавать «Проекты», которыми они также могут делиться с другими пользователями. Тем не менее, пользователи все еще могут видеть информацию только в проектах, которые они создали или были приглашены присоединиться. Все остальные объекты в моей модели существуют в проекте, и если проект удаляется, все содержащиеся в нем объекты также должны быть удалены.
Значит ли это, что у меня должен быть один основной корневой тип "Project" и один репозиторий "ProjectRepository"? Мне кажется неэффективным загружать весь проект каждый раз, когда запрашивается какая-либо страница на моем сайте. На самом деле это не такая большая проблема, потому что я использую NHibernate, который будет лениво загружать только те элементы в проекте, которые запрашиваются. Тем не менее, кажется плохим дизайном, чтобы эффективность сайта сильно зависела от использования ORM с отложенной загрузкой.
Вот обновление, которое, надеюсь, сделает мой вопрос более понятным.
Сначала я пытаюсь понять, должен ли тип моего проекта быть совокупным корнем моей модели. Проект может существовать сам по себе, тогда как отчеты должны существовать в рамках проекта. Если проект удален, соответствующие отчеты должны быть удалены. Означает ли это, что Проект может быть или должен быть совокупным корнем? Это мне не очень понятно.
Если Project является агрегированным корнем, то Report не должен быть корректным? Как я понимаю, корни не должны быть вложены в DDD. Кроме того, разрешено извлекать только совокупные корни из репозиториев. Поэтому, если Report не является агрегированным корнем, у меня не должно быть ReportRepository, и вместо этого я должен получать доступ к отчету только через проект, полученный из ProjectsRepository. Таким образом, даже если страница требует данных только из одного отчета, ей потребуется загрузить весь проект из репозитория Project, чтобы получить отчет.
Кроме того, если Project является совокупным корнем, который содержит отчеты, то удаление проекта из репозитория Project может также быть настроено для удаления содержащихся в нем отчетов. Тем не менее, если и Project, и Report являются агрегатными корнями, то не позволят ли ProjectRepository удалять отчеты при удалении проекта, чтобы преодолеть границы между агрегатами? Разве совокупные корни и соответствующие им хранилища не должны действовать независимо друг от друга?