【问题标题】:How model this scenario with DDD?如何用 DDD 建模这个场景?
【发布时间】:2018-12-03 23:48:17
【问题描述】:

我在使用 DDD 建模此场景时遇到了一些问题。
我在同一个 BC 中有两个实体:OilMachine。有几种不同的油类型,其最终成本取决于某些特性(密度、材料、购买价格等),并且这些特性会定期更新。所以它们不在同一个集合中。因为它们是不同的实体,Machine 只包含一个 Oil 的引用及其 id:

class Oil
  id
  purchase_price
  density
  material
  ...

class Machine
  id
  idOil
  cost
  addOil (Oil)
  ...

机器也有成本,这取决于油的成本和其他一些机器特性。 油是可选的,所以当调用 addOil 方法时,机器会保存它的 id 并用油的成本计算机器成本。
Machine 中没有 calculateCost 方法。 机器有责任在其某些属性发生变化时更新其成本
当我需要重新计算没有 Oil 类的机器成本(我只有它的 id)时,问题就来了。哪个是最好的建模方法?我想到了一些,但没有一个能说服我:

1) Inject Oil 类 在 Machine 构造函数中。我认为这是不可能的,因为 Oil 是一个实体,而 DDD 不允许这样做。
2) Inject Oil repository 在 Machine 构造函数中。如 1,DDD 不允许。
3) Inject Oil 值对象 在 Machine 构造函数中。这意味着当调用 addOil 方法时,我必须保存带有 Oil 实体副本的 OilVO 类,而不是仅保存其 id。
4) 构建聚合。我不喜欢,因为 Oil 有自己的 id,而且还有一些其他的类,比如 Oil,参与了 Machine 成本。机器会变得太大。
5) 将石油成本计算器委托给域服务。这意味着我每次创建 Machine 对象时都必须在 Machine 构造函数中注入这个服务接口:

interface OilCostCalculatorService (OilRepository repo) {
  ...
  public double calculateCost (IdOil id) { 
     Oil oil = repo.getOil(id);
     double cost = .... // calculate cost from oil properties
     return cost;
  }
}

class Machine {
  public Machine (OilCostCalculatorService service, ...) { ... }
}

6) 也许我的课程没有正确建模,但经过深思熟虑后,我没有想到最好的方法。

【问题讨论】:

    标签: domain-driven-design


    【解决方案1】:

    当我需要重新计算没有油类的机器成本时问题就来了(我只有它的 id)。哪个是最好的建模方法?

    由于机器和石油彼此隔离(单独的集合),机器计算无法使用石油的“当前”价格 - 如果没有相互锁定,当前石油价格可能会同时变化机器的变化。

    因此,机器正在处理油价的缓存副本。

    因此,一个答案是在机器中汇总最后一个已知油价的缓存副本,并使用它来估算成本。

    另一种可能性是将域服务传递给机器,其中域服务是一个函数,它接受机油的id,并返回成本的缓存副本。这看起来有点像您的选项 #5,除了不是将服务注入到构造函数中,您将它作为参数传递在您需要的地方。

    在任何一种情况下,您都可能需要调查您的域是否需要明确的时间模型(截至周一的石油价格)。在许多领域都有报价的概念,在某个时间并且可能在有限的期限内进行,在此期间价格将被固定(报价的提供者基本上接受了任何实际价格变化可能不赚钱)。

    【讨论】:

    • 好吧,我只有在计算机器成本时才需要知道油费。当它的某些属性发生变化时,就会发生这种情况。如果没有财产变化,成本保持不变。关于你的提议,Machine 有几个属性,所以我不喜欢在所有这些方法中传递域服务的想法。
    • @user1151816 “如果没有属性变化,成本保持不变”。所以只要你不添加更多的油,那么机器的价格是静态的,即使油的价格上涨了?您应该使用 Machine 中的值对象来描述所有需要的油属性。
    猜你喜欢
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多