2016-02-03 10 views
1

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

Представление совокупного корневого элемента и элемента агрегатного корня. Меню будет иметь коллекцию MenuItem, которая ссылается на Item AR вместе с информацией о заказе в определенном меню.

Мой вопрос: как получить доступ к названию, цене, описанию из меню MenuItem. Скажем, например, меню AR обрабатывает команду, чтобы переупорядочить себя по цене (я знаю, что звучит связанный с UI, но я строго говорю о модели домена здесь, idk, возможно, это бизнес-правило, что меню должно быть отсортировано в особым образом?)

Вы бы получили объект Value для элемента AR внутри MenuItem? Если это так, будет ли в меню AR ссылаться на службу домена для поиска объекта значения для элемента или будет ли MenuItem использовать службу домена.

Я предполагаю, что AR всегда должно быть последовательным, и это может означать, что когда элемент добавляется в меню, MenuItem содержит ссылку на объект значения для элемента.

Похоже, что это нарушит правило «ссылочные объекты по идентичности», поэтому в MenuItem будет содержаться ссылка на ItemId. Учитывая использование источника событий, всякий раз, когда вы хотите применить команду к AR меню, он воспроизводит все его события, доведя их до согласованности, а затем вы выдаете команду для переопределения элементов меню.

В меню MenuItem будет только ItemId, а не детали этого элемента, будет ли это время для загрузки этих элементов? Меню может пересекать его MenuItems, затем использовать службу для поиска объекта Item Item по ItemId для каждого MenuItem, а затем выполнить сортировку.

Спасибо за любой вклад, очень ценится.

ответ

3

Как вы сказали, это, вероятно, должно быть сделано в стороне запроса. Я не уверен, что вижу, как будет удобно поддерживать порядок в домене? Возможно, если бы меню имели разные стратегии упорядочения, но даже тогда. Во всяком случае ...

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

Вы можете сделать что-то вроде этого:

menu = menuRepository.findById(menuId); 
menu.reorder(itemPricingService); 

Некоторые из них также предпочитают разрешать зависимости в обработчике службы приложения/команды:

menu = menuRepository.findById(menuId); 
itemIdList = menu.items().map(extractItemId); 
itemPriceList = itemPricingService.pricesOf(itemIdList); 
menu.reorder(itemPriceList); 

Однако, вы также должны слушать события например, ItemPriceChanged, чтобы сохранить порядок меню в соответствии с изменениями цен.

Существует также другая стратегия, в которой вы можете скопировать информацию о ценах на MenuItem. Цена будет сохранена в конечном итоге в соответствии с событиями, и произойдет переупорядочение с позиции, цена которой изменилась.

Вы можете использовать аналогичную стратегию переупорядочения, которая была реализована here. Взгляните на реализацию reorderFromProduct и ProductBacklogItem.

+0

Благодарим за то, что я нахожусь на том, что вы являетесь бизнес-правлением, это было первое, о чем я думал. Это очень помогает, я думаю, что вы правы, и для «MenuItem» имеет смысл копировать цену на себя, если цена элемента важна для меню в деловых терминах. Это просто должно быть в конечном итоге последовательным, как вы сказали, полагаясь на события «ItemPriceChanged», чтобы оставаться в курсе последних событий. Я должен делать больше исследований, потому что, если «Меню» AR прослушивал события «ItemPriceChanged» всего из «MenuItem», это уже звучит неправильно и может вызвать побочные эффекты при воспроизведении 'Item' – user3228313