При використанні DDD та CRQS, має бути рівно одна подія на команду?


17

Я шукаю спосіб розробити додаток ddd з домовленістю щодо конфігурації.

Скажімо, сукупність "Клієнт" має команду "FillProfile". Він логічно підніме подію "Заповнений профіль".

Чи бувають випадки, коли команда викликає більше, ніж подія, або коли команда піднімає різні події на основі певної логіки? Або це завжди взаємозв'язок 1 - 1 (1 команда завжди викликає жодне, або одну подію заданого типу).

Я запитую це тому, що якщо це факт, що команда завжди буде викликати одну і ту ж подію, я можу будувати свою систему конвенцій на цьому факті. Я знаю, що "RaiseEvent" призведе до "EventRaised" ...


1
якщо команда викликає 2 речі, ви можете очікувати, що кожна річ підніме подію. ProfileGenerated, ProfileSaved, Також будь-яка подія може призвести до помилки, яка знову може призвести до події
Ewan

Також тривіальні системи можуть впроваджувати події BeforeCommand, AfterCommand тощо
Ewan

Або команда може циклічно називати, тобто профіль FillProfiles () профільЗаповнений, профільЗаповнений ....
Ewan

@Ewan, просто хочу тебе виправити. Подія домену не може створити помилку. Лише команди можуть. Події домену означають, що щось сталося , так як команди означають, що є намір зробити щось, що може бути відхилено або прийнято. Іншими словами, помилка повинна виникати перед відправленням події домену (якщо, звичайно, ця подія домену не пов'язана з реєстрацією помилок, звичайно).
Людовик C

Відповіді:


18

Оскільки ви позначили своє запитання "CQRS", я думаю, ви маєте на увазі події в контексті "CQRS & Sourcing Sourcing", як описано тут . У цьому підручнику різниця між подіями та командами добре пояснена:

  • події фіксують елементарні "речі, які можуть статися" у вашій системі, з точки зору системи.

  • команди визначаються тим, що користувач розглядає як операцію, з його погляду

І хоча це часто призводить до пари команд та подій із відповідністю 1: 1, ці різні точки зору можуть призвести до команд, які запускають більше однієї події, або різних подій залежно від параметрів команди. Я навіть можу уявити випадки, коли команда взагалі не викликає події, але це був би дуже винятковий випадок, не дуже типовий.

Наприклад, у підручнику згадуються події

  • TabOpened
  • Напої Замовлені
  • Їжа упорядкована

і команди

  • OpenTab
  • Зробити замовлення

Тут команда "OpenTab" призведе до події "TabOpened", але команда PlaceOrder призведе до подій "DrinksOrряд", "FoodOrряд" або обох.

Насправді, якщо ви розробляєте нову систему "з нуля", ви можете спробувати спроектувати її за допомогою відповідності 1: 1 між командами та подіями і подивитися, наскільки добре вона масштабується, коли система стає більшою. Можна навіть спробувати гібридний підхід: перелік подій та команд із відповідністю 1: 1 разом із деякими додатковими комбінованими командами. Просто спробуйте, наскільки далеко це веде вас до конкретної системи, яку ви проектуєте.


10

Зазвичай одна команда призведе до однієї події. Але в деяких випадках це може бути і більше, це залежить від вашої реалізації.

Або ваша команда викликає інші команди, і кожна з них створює власні події. Або ваша команда виконує різні завдання самостійно і видає кілька подій. Наприклад:

RegisterUserCommand

  • User.create (електронна пошта, пароль) → UserCreateEvent
  • User.updateProfile (firstName, lastName, location) → UserProfileUpdateEvent
  • User.joinDefaultGroup () → UserJoinedGroupEvent

Що станеться, якщо згодом ви вирішите це зробити UserWasAddedToCrm? Переписати весь потік?
mcintyre321

@ mcintyre321 пошук хореографічних та оркестрованих подій
Бентен

10

Одна команда може викликати кілька подій. Це просто логічний висновок одного факту: Composite commandіснує.

Скажімо, у вас є дві команди, кожна з яких викликає подію. Потім ви створюєте складену команду з цих двох. З погляду того, хто використовує складену команду, здається, що команда викликала дві події.

Тож ніщо не заважає вам мати єдину команду, що піднімає кілька (а то й ніяких) подій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.