Определение совокупных корней и отношений между ними - PullRequest
0 голосов
/ 06 октября 2011

Я изучаю DDD и хотел начать моделировать довольно тривиальный пример - приложение для блога.

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

Вот моя модель:

Site
    has many
        Blog
            has reference to Site
            has many
                Post
                    has reference to Blog
                    has Category
                    has many
                        Comments

В этом примере единственное, в чем я уверен, это то, что Comment - это объект-значение, поскольку он не имеет смысла вне контекста поста.

Но тогда на основе:

Только агрегированные корни могут быть получены напрямую с помощью запросов к базе данных. Все остальное должно быть сделано через обход.

Я был бы склонен создавать AR сайтов, блогов и постов, поскольку хотел бы получить их все напрямую, а не обходить коллекцию.

Я понимаю, что Блог - это не совсем сложная модель предметной области, поэтому на самом деле не стоит применять DDD, но я просто хочу понять, как моделируются отношения такого типа.

1 Ответ

2 голосов
/ 11 октября 2011

Не потому, что у вас есть иерархия, вы должны определить агрегат.Агрегатная конструкция пригодится, если у вас есть инвариант для поддержки в иерархии.

В вашем примере, предположим, что вы хотите, чтобы у каждого поста в блоге был уникальный 'slug' (стиль Wordpress, так что заголовокпоявляется в URL).Только сущность «Блог» может применять этот инвариант.Аналогичным образом, в этом случае имеет смысл сделать его совокупным и добавить сообщение через сущность блога.

Другой пример: ваш сайт может быть общедоступным или частным.Это атрибут сущности сайта.Поэтому вы должны обязательно получить доступ к сообщению с использованием обхода из совокупного корня, которым будет сайт, поскольку только сайт может разрешить вам или нет доступ к базовым объектам.

Если вы сделаете сайт совокупным корнем, вы можете получить URL-адрес, подобный следующему:

http://site.com/myblog/apost

Ваш код должен сначала получить сущность сайта, из этой сущности он получает блог, а из сущности блога - выборкупост.Как вы будете извлекать дочерние объекты, зависит от вас.Эта модель не заставляет вас загружать все записи блога в память при получении сайта.Он просто заставляет вас получать блог с сайта и сообщения из блога.

...