Событие домена никогда не завершается неудачно, потому что это уведомление о том, что произошло (обратите внимание на прошедшее время). Но операция, которая сгенерирует это событие, может завершиться ошибкой, и событие не будет сгенерировано.
Сценарий, который вы нам рассказали, показывает, что на самом деле вы не используете DDD, вы делаете CRUD, используя слова DDD. Да, я знаю, что вы новичок в этом, не волнуйтесь, все неправильно понимали DDD, пока не получили его (но это может занять некоторое время и много практики).
DDD предназначен для определения абстракции модели предметной области, которая не является кодом. Код — это когда вы реализуете эту абстракцию. Совершенно очевидно, что вы не выполнили надлежащее моделирование, потому что эксперт в предметной области должен сказать вам, что произойдет, если продуктов нет на складе.
Далее, на этом уровне нет транзакций db/acid. Это детали реализации. Принцип работы DDD заключается в том, чтобы определить, где бизнесу нужно, чтобы вещи были согласованы друг с другом, и это называется совокупность.
Заказ был отправлен, и на этом прецедент останавливается. Когда вы публикуете OrderWasMade
event, запускается другой вариант использования (вычет инвентаря или что-то еще). Это другой бизнес-сценарий, связанный, но не являющийся частью "отправки заказа". Если запаса недостаточно, публикуется другое событие NotEnoughInventory
, и запускается другой вариант использования. Здесь мы следим за бизнесом и определяем каждый шаг, который делает бизнес для выполнения заказа.
Искусство DDD заключается в понимании и определении гранулярных бизнес-функций, задействованных агрегатов, бизнес-поведения, которое принимает решения и т. д., и это не имеет ничего общего с базой данных или транзакциями.
В DDD совокупность — это единственное место, где необходимо использовать единицу работы.
Чтобы ответить на ваши вопросы:
Кажется, что каждое событие будет в своей области транзакции, что означает, что система требует одновременного открытия нескольких подключений к базе данных. Итак, если я использую IIS Server, я должен включить DTC, я прав?
Нет, транзакции, события и распределенные транзакции — это разные вещи. IIS — это веб-сервер, я думаю, вы хотите сказать SqlServer. Вы всегда открываете несколько подключений к базе данных в веб-приложении, DTC не имеет к этому никакого отношения. На самом деле вопрос говорит мне, что вам нужно больше читать о DDD, а не только книгу Эванса. Честно говоря, с точки зрения DDD не имеет особого смысла то, о чем вы спрашиваете. Вы знаете один из принципов DD: БД (как в деталях постоянства) не существует.
Есть ли какая-либо связь между доменными событиями и доменными службами?
Они оба являются частью домена, но у них разные роли:
- События домена сообщают миру, что что-то изменилось в домене
- Доменные службы инкапсулируют поведение домена, которое не имеет собственного сохраняемого состояния (например, Расчет налога).
Обычно служба приложения (которая действует как хост для бизнес-варианта) будет использовать службу домена для проверки ограничений или сбора данных, необходимых для изменения агрегата, который, в свою очередь, генерирует одно или несколько событий. Агрегаты - это те, которые сохраняются, и всегда агрегат сохраняется атомарным образом, то есть транзакция / единица работы БД.
person
MikeSW
schedule
05.03.2016