DDD & Event Sourcing: срок действия как спецификация или команда? - PullRequest
0 голосов
/ 22 октября 2018

Справочная информация

Я пытаюсь применить DDD и источники событий к части моего проекта.

Это аукционная заявка.

  • Customer регистров Item и Auction равно STARTED, когда администратор approves Item.
  • Auction имеет duration, что позволяет Bidder к Bid в пределах duration.
  • Auction считается ENDED, после этого duration и Bidder не может делать ставки.
  • Auction также ENDED, когда maximum bids limit встречается, даже если duration не прошло.
  • Customer может select один Bid в пределах duration и 5 days after the duration ends.
  • После этого мы рассмотрим Auction EXPIRED и Customer не можем select a Bid.

Требования к приложению:

  • Bidder должен иметь возможность запрашивать аукционы с аукционом.
  • Должен отправлять уведомления о ended и expired аукционах только один раз.

Подводя итог, я определил свойклассические модели доменов DDD:

Объекты: Auction, Bid, Customer, Administrator, Bidder

Объекты значений: AuctionStatus (STARTED, ENDED, EXPIRED, SELECTED)

Совокупные корни: Auction, Customer, Bidder, Administrator


Задача

Проблема в том, что я не уверен, стоит ли мне

A) определять спецификацию, такую ​​как AuctionEndedSpecification, и использовать ее для запроса и оценки статуса и действий ограничения.

или

B) рассмотрите EndAuction как команду и вставьте простой атрибут status в Auction

хитрая часть A: чтобы судить, истек или закончился аукционМне нужно текущее время, и это делает код сложнеереализовать.И я думаю, что это может быть сложнее реализовать на стороне запроса.

хитрая часть B: Аукцион заканчивается по нескольким причинам (по истечении срока, когда встречается ограничение максимальной ставки).Я узнал, что не стоит позволять событию вызывать другое событие.Но в этом случае событие BidAdded может вызвать событие AuctionEnded.Кроме того, если я справляюсь с истечением срока с запланированными задачами, мне кажется, что моя модель предметной области предполагает простоту чтения, что тесно связано с требованиями приложения.

Если вы столкнулись с подобными проблемами, пожалуйста, помогите мнеопыт.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

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

Обращаю ваше внимание на написание Джон Кармак

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

Я бы добавилв качестве пояснения, что это введено модель домена ;обычно нет необходимости толкать свои часы за пределы приложения.

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

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

Ваш второй подход согласуется с идеей, что модель - это просто бухгалтерия - «конец аукциона» происходит извне эта модель.

Любой подход может быть "правильным", в зависимости от того, что вы строите.

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

Предупреждение: получение сантехника правильно может быть боль: как приложение узнает , что аукционам нужно время?Сохраняется ли расписание при перезапуске приложения?и т. д.

0 голосов
/ 22 октября 2018

Похоже, что состояние вашего Аукционного агрегата можно явно рассчитать по событиям без каких-либо дополнительных событий.Как на стороне записи, так и на стороне чтения.

Причины, по которым вы все еще можете добавить события AuctionEnded:

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

  • у вас есть внешний сервис, который не хочет самостоятельно рассчитывать конечное состояние аукциона.

  • есть общий совет, что эксперт по предметной области должен читать поток событий вашего агрегата.Я думаю, что я хотел бы видеть метку "AuctionEnded" в таком потоке.

Если вы решите создавать события AuctionEnded, вам потребуется Saga / ProcessManager для выдачи команды "EndAuction"в нужное время.

...