Ссылка на другой совокупный корень внутри другого совокупного корня?

Я занимался DDD уже пару лет, и до сих пор это сложно, когда дело доходит до разработки агрегатов. Это забавная часть DDD, от которой кружится голова. Я задаю этот вопрос, поскольку я архитектор в проекте, и мы находимся в процессе разработки модели. Это итерация, когда модель развивается параллельно с графическим интерфейсом и сбором требований вместе с заказчиком. Теперь к проблеме. Наш сценарий заключается в том, что мы сталкиваемся с некоторыми агрегатами, которые превращаются в очень большие AR. Я думаю, что хорошо нахожу объекты Value и избегаю ловушки анемичной модели предметной области. Но я никогда не был в такой ситуации. Одним из примеров является то, что наша система должна представлять антенну мобильной связи. Антенна расположена на зеленом поле. А вот антенна может иметь укрытие с оборудованием. Антенна может иметь микроволновую связь, может иметь оптоволокно в земле, может иметь радиоэлементы, может иметь источник питания. Лицом к лицу. Если Антенна отключена... все эти зависимости также удаляются. Так как они являются частью установки (кроме зеленого поля :)) Но Вы поняли. Модель антенны сложна... И большие AR не гибки в отношении блокировок параллелизма, производительности, потребления памяти.

После прочтения очень хорошей статьи Вона Вернона об эффективном дизайне дополненной реальности http://dddcommunity.org/library/vernon_2011/ Я понимаю, что нам нужно начать резать наши большие AR на куски.

Моя идея состоит в том, чтобы поступить так, как предлагает Вернон, переместить, например, MicrowaveLinks в отдельный AR (даже если это не так). Объект MicrowaveLink, теперь AR, является эталонной антенной по идентификатору. В классе MicrowaveLink Entity у нас есть свойство объекта значения, которое называется AntennaId. Наши варианты использования поддерживают этот сценарий. Мы редко перечисляем антенну и ссылки вместе. Таким образом, загрузка MicrowaveLinks возможна через MicrowaveLinkRepository.ListByAntenna(Guid антеннаId)

1) Делали ли вы этот AR-сплит раньше и как вы это делали? 2) Удалось ли вам поддерживать эту связь AR -> AR без изменений как с помощью ограничений домена, так и с помощью БД (мы используем EF 5 в качестве ORM)?

Моя оптимальная цель - пропустить коллекцию Antenna.Microwaves на антенне. Таким образом, антенна не знает, есть ли ссылки. Линки знают, на какой Антенне они установлены. И в объекте MicrowaveLink мне нужно только свойство AntennaId с, надеюсь, ограничениями БД, которые гарантируют, что антенна существует.

Мне известно, что я могу вручную добавить ограничения FK в методе Seed в EF или в БД напрямую через сценарии T-SQL. Но может ли эта взаимосвязь каким-то образом поддерживаться сопоставлением EF5 Code First Fluent?


person Magnus Backeus    schedule 12.07.2013    source источник


Ответы (1)


Судя по звукам, у вас Installation AR. Когда требуется AR в другом, вы должны смоделировать содержащийся AR как только идентификатор в контейнере или VO, если требуется.

У вас должны быть жесткие края вокруг ваших AR.

Вернемся к примеру Order / OrderLine :)

OrderLine кажется, что «требуется» продукт, но вы никогда не должны давать экземпляр продукта OrderLine. Вместо этого моделируйте, скажем, ProductName и ProductId как VO в OrderLine. Теперь у вас есть явное преимущество перед вашим Order AR.

Надеюсь, это немного поможет.

person Eben Roux    schedule 12.07.2013
comment
Вот так сейчас выглядит моя модель. Установка — это сайт в моей модели, и я отделил микроволновые ссылки от сайта через объект VO на стороне микроволновой печи. Таким образом, это свойство MicrowaveLink.LinkedSite представляет собой ВО, содержащее SiteId и SiteName. Просто любопытно, есть ли у вас живой опыт этого и насколько хорошо это получается? Насколько я знаю, EF не поддерживает такого рода отношения, когда вы выражаете только это отношение «один ко многим» без свойств навигации... просто VO с одной стороны. - person Magnus Backeus; 13.07.2013
comment
Боюсь, у меня нет опыта работы с EF. Я не особенно люблю ORM :) --- но что касается успеха применения методов DDD, я не могу жаловаться. - person Eben Roux; 13.07.2013