【问题标题】:In a DDD design, how to pass domain service through AR在 DDD 设计中,如何通过 AR 传递域服务
【发布时间】:2018-09-24 01:45:18
【问题描述】:

我有以下聚合:

  • 结帐(根)
  • 要求:CouponRequirement、AnotherRequirement、YetAnotherRequirement
  • 优惠券

Checkout 有许多 Requirements 需要满足才能完成 Checkout。 每个Requirement 都有一个fulfill(data) 方法负责实现过程。

其中一个要求是CouponRequirement,当它满足时,需要确保有特定优惠券的库存并保留它。 为此,我需要访问 CouponRepositoryCouponService

如何调整我的设计以适应这种依赖关系?

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
}

【问题讨论】:

    标签: oop domain-driven-design


    【解决方案1】:

    如何调整我的设计以适应这种依赖关系?

    通常的答案是应用程序将执行其工作所需的任何功能传递给聚合根。

    在您的特定情况下,这可能看起来像 CouponService 的一个实例,作为 fullfillRequirement 方法的参数传递给 Checkout 聚合根。

    也许我只是不能有一个通用的fulfillmentRequirement 并且需要为每种具体类型提供一个?

    我希望是这样的;毕竟您已经确定了一个路径不同的用例。

    【讨论】:

    • 这似乎是显而易见的答案,但fulfillRequirement 也可以满足不同类型的要求,例如需要不同依赖项(或没有)的ClientInformationRequirement。也许我不能有一个通用的fulfillRequirement 并且每个具体类型都需要一个?另一种解决方案是使用静态服务定位器,我不希望这样做。
    猜你喜欢
    • 2020-10-04
    • 2015-04-23
    • 1970-01-01
    • 2016-11-15
    • 2013-10-06
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多