Совокупный ссылочный вопрос о дизайне, управляемом доменом - PullRequest
3 голосов
/ 26 августа 2011

У меня нет книги Эрика Эванса по разработке доменов на мне, но в сущности она говорит

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

Например, мой совокупный корень Team имеет метод с именем AddPlayer() и возвращает добавленную сущность Player. Означает ли это, что я нарушаю правило или он говорит, что не может вытащить сущность Player из воздуха, например, вытаскивая ее из хранилища за пределами его совокупной границы?

Ответы [ 2 ]

4 голосов
/ 26 августа 2011

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

http://www.ebenroux.co.za/post/2010/08/20/Natrual-Aggregates-vs-Synthetic-Aggregates.aspx

У вас есть Team, и у вас есть Player.Это было бы 2 Совокупных Корня.Создание команды в качестве совокупного корня и игрока как отдельной сущности - вот что, вероятно, причиняет вам боль.В реальной жизни игроку не обязательно принадлежать к команде, и это также зависит от того, какая у вас «команда».Это просто общее имя, или текущие члены, или настоящие люди, которые могут выйти на поле в определенный день?

Так что вы, вероятно, в конечном итоге будете иметь разные «команды»:

  • Team
  • Squad
  • GameSquad

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

Но вернемся к тому, на что Эрик ссылается в своей книге: я думаю, что это относится к чему-то вроде этого (используя вашу форму):

var line = Order.AddLine (SomeProduct);

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

Также было некоторое обсуждение того, возвращает ли хранилище только AR или сущности (которые в некоторых хранилищах являются AR).Согласно тому, что I нашел синюю книгу, вы можете извлечь сущность из хранилища.

В любом случае.Просто некоторые мысли.HTH:)

0 голосов
/ 27 августа 2011

Я думаю, вы слишком много читаете под руководством Эрика Эвана.Я не верю, что он говорит, что вы не можете выставить игрока из команды.Вместо этого я читаю правило как Эбен.Если у игрока НЕТ значения вне контекста команды, то вы не хотели бы передавать игрока, особенно если «внешний объект» не имеет никакого отношения к команде.Это было долгое время с тех пор, как я посмотрел на эту книгу.Вы уверены, что это не относится к границам системной интеграции?Я не могу себе представить, что Эрик говорит, что вы не можете разыграть игрока внутри своей системы.

...