В дизайне DDD, как передать доменный сервис через AR - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть следующий агрегат:

  • Оформить заказ (root)
  • Требование: Требование к купону, Другое требование, Ещё одно требование
  • Купон

A Checkout имеет много Requirements, которые необходимо выполнить, чтобы завершить Checkout.Каждый Requirement имеет метод fulfill(data), который отвечает за процесс исполнения.

Одним из этих требований является CouponRequirement, который при выполнении должен обеспечить наличие запаса для определенного купона изарезервировать это.Чтобы это произошло, мне нужен доступ к CouponRepository или CouponService.

Как я могу адаптировать свой дизайн для соответствия этой зависимости?

FulfillRequirementCommand

function handle($cmd) {
   $cho = $this->checkoutRepository->get($cmd->checkoutId);
   $cho->fulfillRequirement($cmd->requirementType, $cmd->requirementData);
}

Оформить заказ

function fulfillRequirement($reqType, $reqData) {
    $req = $this->getRequirement($reqType);
    $req->fulfill($reqData);
}

Требование купона

function fulfill($data) {
    // check stock / reserve coupon
}

1 Ответ

0 голосов
/ 24 сентября 2018

Как я могу адаптировать свой дизайн для соответствия этой зависимости?

Обычный ответ заключается в том, что приложение передает объединенному корню любые возможности, необходимые для выполнения его работы.

В вашем конкретном случае это, вероятно, будет выглядеть как экземпляр CouponService, передаваемый в агрегатный корень Checkout в качестве аргумента метода fullfillRequirement.

Может быть, я просто могу 'у него нет универсального executeRequirement и он нужен для каждого конкретного типа?

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

...