Совокупные корни зависят от варианта использования. Значит ли это, что мы можем получить действительно много репозиториев? - PullRequest
2 голосов
/ 01 февраля 2011

Я много слышал, что совокупные корни зависят от варианта использования. Но что это значит в контексте кодирования?

У вас есть класс обслуживания, который содержит методы хранения (варианты использования), которые будут выполнять что-то в хранилище. Отлично, поэтому вы используете репозиторий, равный совокупному корню, для выполнения запросов.

Теперь вам нужно выполнить какой-то другой вид операции, который использует совершенно другой вариант использования, чем первый класс обслуживания, но использует те же сущности.

Вот представление:

Объекты: Клиент, Заказы, LineOrder

Сервис 1: добавление новых клиентов, удаление некоторых клиентов, получение заказов клиентов

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

Услуга 2: получение клиента из фактического заказа

Здесь совокупный корень выглядит как Order, потому что вам нужен этот репозиторий для выполнения этого варианта использования.

Если я ошибаюсь, поправьте меня. Теперь это означает, что у вас есть 2 совокупных корня.

Теперь мой вопрос таков: поскольку совокупные корни зависят от варианта использования, означает ли это, что мы можем получить действительно много репозиториев, если у вас будет много вариантов использования?

Вышеприведенный пример, вероятно, был не лучшим примером ... поэтому предположим, что у нас есть Журнал, в котором содержатся JournalEntries, в каждой записи которого содержатся Задачи, Проблемы и Заметки. (Это в контексте сообщения системе о том, что было сделано с проектом)

Значит ли это, что у меня будет 2 хранилища? (Журнал, JournalEntry) В тех случаях, когда мне нужно добавить новые задачи, проблемы и заметки из записи журнала? (Можно рассматривать как услугу)

Или может иметь 4 хранилища. (Журнал, задание, проблемы, заметки) В каких случаях мне нужен доступ к задаче, проблемам и примечаниям? (Можно рассматривать как другую услугу)

Но это будет означать, что если мне понадобятся оба из этих сервисов (которые на самом деле хранят сценарии использования), мне потребуется 5 хранилищ, чтобы иметь возможность выполнять сценарии использования в обоих из них? Спасибо.

Ответы [ 3 ]

2 голосов
/ 20 февраля 2011

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

Но мой опыт показывает, что у вас есть несколько хранилищ (больше, но не много).Мои Агрегаты обычно содержат несколько классов, и граф объектов Агрегат не такой глубокий (если вы понимаете, о чем я).

Но я стараюсь быть конкретным:

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

2) Но все не может быть совокупными корнями, поэтому попробуйте капсулироватьобъект, который тесно связан.Заметки выглядят как кандидат на владение корневым объектом.Вы, вероятно, всегда относите Notes к корню, иначе он теряет свой контекст.Примечания не могут жить сами по себе.

3) Помните, что агрегаты используются для разделения больших сложных доменов на более мелкие "островки", которые заботятся о своих обитателях.Важно не делать свой домен более сложным, чем он есть.

4) Вы не знаете, как выглядит ваша модель, пока не достигли большой стадии реализации проекта.Если вы понимаете, что некоторые репозитории используются не так часто, они могут быть кандидатами на слияние с другим корневым объектом (если они имеют такие отношения).Вы можете выделить объекты, которые так часто используются через корневой объект без его контекста.Я имею в виду, например, если журнал является совокупным корнем и содержит заметки и задачи.Через некоторое время ваша модель растет, и, возможно, у Задач появляются ассоциации с Action и ActionHistory, а также с User и Rule and Permission.Теперь я просто выбрасываю кучу общих объектов в функциональности прав / действий / пользователей.Возможно, это приводит к случаям использования, которые подходят к Задачам с другой стороны, «Просмотреть все Задачи, выполняемые этим Пользователем» и т. Д. Задачи все больше вовлечены в какой-либо механизм состояний / рабочих процессов и, следовательно, являются кандидатами на то, чтобы быть самим совокупным корнем.

Окей.Не лучший пример, но он может дать вам идею.Корневой объект может содержать дочерние объекты, где некоторые из его дочерних элементов также могут быть корневыми объектами, потому что он нам нужен в другом контексте (кроме журнала).Но я сам бился головой об стену каждый раз, когда ты запускаешь новую модель.Просто плывите по течению и дайте модели развиваться через своих клиентов / подписчиков.Вы уточняете модель с помощью ее использования.Сервисы (сервисы приложений, а не доменные сервисы), конечно, расширяются с помощью методов, которые отвечают на пользовательский интерфейс и варианты использования (часто один к одному).

Надеюсь, я каким-то образом помог вам ... или нет: D

1 голос
/ 23 февраля 2011

Да, вы, скорее всего, получите 5 репозиториев (журнал, журнал, задача, задачи, заметки). Затем ваши службы будут использовать эти репозитории для выполнения CRUD для каждого типа объектов.

Ваша реакция "вау так много репозиториев" не редкость для разработчиков, впервые знакомых с DDD.

Тем не менее, ваши репозитории обычно имеют небольшой вес, если предположить, что ваша модель и схема БД достаточно равномерно согласованы, что часто имеет место. Если вы используете ORM, такой как nHibernate, или такой инструмент, как генератор кодов, тогда создавать ваши репозитории станет еще проще.

0 голосов
/ 02 февраля 2011

Сначала вам нужно определить, что такое агрегат.Я не знаю об агрегатах вариантов использования.Я знаю о агрегатах следующих ...Агрегаты являются объединением нескольких субъектов.Одной из сущностей является совокупный корень, остальные сущности (или типы значений) имеют смысл только в выбранном совокупном корневом контексте.Например, вы можете определить Order и OrderLine как совокупность, если вам не нужно выполнять какие-либо независимые действия с сущностями OrderLine.Это означает, что OrderLine имеет смысл только в контексте Order.Зачем вообще определять агрегаты?Требуется уменьшить ссылки между объектами.Это упростит вашу модель предметной области.И, конечно, вам не нужно иметь OrderLineRepository, если OrderLine является частью агрегата Order.Вот ссылка с дополнительной информацией.Вы можете прочитать книгу Эрика Эванса DDD.Он очень хорошо объясняет агрегаты.

...