gpt4 book ai didi

domain-driven-design - 事件溯源 - 域逻辑适用于何处?

转载 作者:行者123 更新时间:2023-12-04 08:23:03 26 4
gpt4 key购买 nike

我刚刚在看 Greg Youngs 谈论事件采购,但我对业务逻辑的适用范围感到困惑。一个简单的例子:

1) Shopping Cart Created 
2) Item Added
3) Item Added
4) Promotional Code - 20% Off

促销代码是针对购物车项目计算的,并将结果存储为事件。我知道“PromotionalCodeAddedEvent”可能有意义,但数学在哪里发生?我在想:
public void AddPromotionalCode(PromotionalCode code)
{
//perform calculation against shopping cart items.
//if valid
ApplyChanges(cmd);
}

然后结果不会在任何地方结束,读取模型将不得不执行计算。

我不完全理解这个概念,任何帮助都会很棒。

最佳答案

看似简单的促销代码实际上可能是一个相当复杂的用例。这主要是因为促销代码是(通常)由一个或多个业务用户维护的逻辑,而它本身也属于域内部。从这个意义上说,它是非传统的。有多种方法可以解决这个问题,我将概述的只是我个人的方法。

为了便于论证,假设您有一系列简单的已知促销代码,例如:

  • X% 折扣购买,有或没有最低购买
  • 购买可享受 $X 优惠,无论是否有最低消费

  • 我们也可以做一些假设:
  • 促销代码有一个开始日期
  • 促销代码有一个结束日期

  • 促销代码的应用可能很棘手。考虑我们定义的两个场景。 “$X Off Purchase”比较简单,因为它是固定金额。然而,“购买 X% 折扣”更为复杂。如果我们只有固定金额,我们可以在达到任何阈值后立即将折扣应用到购物车。对于基于百分比的折扣,如果用户要添加两件商品、添加促销代码,然后再添加另一件商品,则促销已被“应用”。

    因此,我个人只会将促销代码“附加”到购物车。为什么?原因是在结账时,我可能会假设将使用购物车生成订单。在那之前,购物车的内容是流动的。假设折扣金额不固定,用户对购物车的操作将改变购物车的总值(value)以及总折扣。如果用户从购物车中删除一个或多个项目并且购物车的总值(value)低于应用折扣的阈值,它也可以将任一折扣设为无效。

    所以,我实际上会涉及多个命令。基本上任何影响购物车值(value)的命令都可能改变折扣金额。为此,我将寻找要为以下命令重新计算的折扣金额:
  • 将商品添加到购物车
  • 从购物车中移除商品
  • 更改购物车中的商品数量
  • 将促销代码添加到购物车
  • 更改附加到购物车的促销代码

  • 由于这些都是针对购物车的操作,因此我将在包含购物车中数据的参与下计算促销代码本身的折扣。感觉就像一个促销代码将是一个聚合,沿着这条路走下去。所以,我会让命令处理程序调用一个域服务,它可以为我的购物车提供它需要的信息。该域服务将加载促销代码,我将能够传入该购物车中的行项目,以便促销代码告诉我计算出的折扣是多少。然后,我将生成事件,其中包含购物车的新值(value)以及调整后的值(value)(折扣)。沿着这条路走下去,根据购物车中的行项目计算折扣的逻辑是促销代码的责任。

    相反,您可以将此责任放在购物车中。不过,就我个人而言,我觉得在促销代码中封装域逻辑本身更有意义。我曾提到您很可能会从购物车中生成订单。通过将促销代码作为一个集合,它包含根据订单项应用折扣的逻辑,我们有一个单一的事实,即我们如何计算订单项的折扣 - 无论是购物车还是订单条款。

    关于domain-driven-design - 事件溯源 - 域逻辑适用于何处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41612263/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com