【发布时间】:2020-03-18 04:54:02
【问题描述】:
我正在尝试在我的最新项目中应用 DDD。虽然我在确定将一些业务逻辑/计算放在哪里时遇到问题。
首先我将描述业务流程,然后我将如何考虑实施。
业务流程: 它只是将收据项目添加到收据中。但是,商品的价格取决于客户的类型和商品的数量。
即:“A”类客户想要购买两餐。在他的安排中,允许他吃一顿午餐打折,但因为他很饿,他吃了两顿。第一顿应该是 4 欧元(折扣),第二顿应该是 6 欧元(全价)。
我的想法是:
产品 - 一个实体(具有不同的有界上下文,将仅用作输入参数) - 字段:代码、名称、...、价格集合每个都针对不同的客户类型。
ReceiptItem - 实体 - 字段:产品代码、产品名称、数量、价格、... 收据作为聚合根 - 字段: 客户(实体)- 包含 ReceiptItems 的集合
在收据上,会有一个方法addItem(Product product, int count),我计划在这个方法中添加正确的价格计算。
回到我们的例子:receipt.addItem('menu1', 2)
所以我会检查客户类型以及允许他打折的午餐数量。鉴于上面的例子,我会看到,他是允许的。然后我需要获得实际的折扣价格,我会直接从公开方法 getCustomersPrice(customerid) 的产品中获得。 最后,我会在 Receipt 中添加两个收据项目。它们都将具有相同的产品代码,但价格不同。 (如果配额为 2 或更多,我只会以折扣价将一件物品添加到收藏中,但会计算 2 件)。
您会说这是一个好方法吗?我担心将产品作为输入参数传递给 addItem。因为它似乎创建了一个紧密的耦合。
谢谢。
【问题讨论】:
-
现在我正在查看杂货店的收据。收据包含一些折扣以及产品。折扣作为单独的项目列出,产品以全价列出。这样,任何产品都不应该“知道”其对特定客户的价格。但客户可能有许多适用于不同产品的折扣,如果符合条件,可以添加到订单中。
-
我喜欢这个,它实际上允许保持域对象相当干净,只包含必需品,同时对不同的规则集具有灵活性。谢谢一个好主意。
标签: domain-driven-design business-logic