【发布时间】:2018-12-03 23:48:17
【问题描述】:
我在使用 DDD 建模此场景时遇到了一些问题。
我在同一个 BC 中有两个实体:Oil 和 Machine。有几种不同的油类型,其最终成本取决于某些特性(密度、材料、购买价格等),并且这些特性会定期更新。所以它们不在同一个集合中。因为它们是不同的实体,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) 也许我的课程没有正确建模,但经过深思熟虑后,我没有想到最好的方法。
【问题讨论】: