Как определить агрегаты и корни агрегатов и связь между агрегатами

Итак, я новичок в DDD и пытаюсь правильно разработать приложение. Но у меня возникли некоторые трудности с определением совокупных корней.

Мне нужно более или менее дерево

*Customers
*Each customer can have 0 or more licenses
*Each license can have 0 or more courses
*Each course can have 0 or more lessons
*Each lesson can have 0 or more slides and videos

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

Независимо от того, как я об этом думаю, я получаю только то, что Клиент будет корнем агрегата для агрегата, который содержит [Клиент, Лицензия, Курс, Урок, Слайд, Видео].

Но это довольно большая совокупность, и я понял, что больших совокупностей следует избегать.

Тогда викторина будет совокупностью вопросов, ответов и так далее. В качестве второго вопроса, который я мог бы задать, как должна выглядеть ссылка? потому что, скажем, я хочу, чтобы викторина появлялась в видео через 4 минуты. Что ж, тогда моя викторина должна быть связана с этим видео и хранить время. Но это видео глубоко внутри другого агрегата (под клиентом, лицензией, курсом, уроком) и не должно быть напрямую связано напрямую с этим агрегатом викторины.

Итак, как мне это решить. Я заказал свою большую книгу DDD, но ее не будет здесь какое-то время. Если бы я мог понять это раньше, было бы здорово!

Я не должен иметь значения, но я использую .net С# mvc с шаблоном ef5 и репозитория.


person Rickard Liljeberg    schedule 12.04.2013    source источник


Ответы (2)


Чтобы упростить вещи, вы должны использовать CQRS, т.е. использовать разные модели для «записи» и для запросов. Это означает, что у нас есть 2 случая: 1. создание и обновление бизнес-объектов (сущностей) 2. создание упрощенной модели из бизнес-объектов, позволяющей выполнять простые запросы.

Использование этого подхода означает, что вы можете сосредоточиться на моделировании Клиента, Лицензии, Курса и Уроков исключительно с целью моделирования реального поведения и отношений между ними.

Здесь легко впасть в ориентированный на данные подход, когда Заказчик рассматривается как контейнер для лицензий, который, в свою очередь, является контейнером для курсов и т. д. Совершенно очевидно (даже без особой информации), что эти объекты являются совокупными корнями, а не контейнерами.

Было бы более уместно думать, что уроки организованы в курсы, которые организованы в соответствии с лицензиями. Это означает, что сущность «Курс» связана с некоторыми сущностями «Урок», поэтому на самом деле у курса нет уроков. У него есть название, учебная программа и т. д. Уроки, профессора, студенты «прикреплены» к курсу, но не являются его частью.

Сущность Customer моделирует клиента. Когда клиент покупает несколько лицензий, он получает право доступа к курсам, связанным с этой лицензией. Опять же, у клиента нет лицензий. Поэтому здесь вам нужно смоделировать ассоциации между клиентом и лицензиями. При этом подумайте, какие детали License зависят от того, какие детали Customer (скорее всего, это не так, поскольку это совершенно разные вещи, поэтому достаточно базового (CustomerId,LicenseId)). Конечно, это простые предложения, так как я точно не знаю домен.

Суть в том, что вы должны глубже понять, что означают Клиент, Лицензия и т. д. для домена, и сопротивляться желанию смотреть на вещи с «очевидной» точки зрения. Моделирование DDD не сложно, но очень сложно, потому что вы действительно не должны относиться к этому поверхностно.

person MikeSW    schedule 12.04.2013
comment
Я смотрел на CQRS и счел его излишним для моего довольно небольшого проекта. Но я начинаю понимать, почему я ошибся. Я также начинаю понимать вашу точку зрения о том, что вы не видите просто контейнеры и то, как они хранятся. Мне есть чему поучиться! - person Rickard Liljeberg; 12.04.2013

Вы должны определять агрегаты после бизнес-инвариантов.

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

Однако вы также должны учитывать, нужно ли вам разрабатывать разные ограниченные контексты. Поговорите со своим экспертом (экспертами) в предметной области, объяснив, что каждый ограниченный контекст относится к определенной точке зрения по данному вопросу.

person Giacomo Tesio    schedule 12.04.2013
comment
Я прочту эссе Вернона. Я тоже жду его книгу! Я пока не совсем понимаю, как на самом деле работает BC. они достаточно просты на первый взгляд, но я не совсем понимаю их. - person Rickard Liljeberg; 12.04.2013
comment
@RickardLiljeberg Пока вы не получите книгу Вернона, вы можете прочитать мой пост о ограниченных контекстах здесь sapiensworks.com/blog/post/2012/04/17/ - person MikeSW; 12.04.2013
comment
Привет, отлично, я прочитал это вчера. Гениально, но слишком абстрактно, когда не хватает многих других знаний :-) Принцип достаточно прост для понимания, но применить его на практике не так просто. - person Rickard Liljeberg; 12.04.2013