【发布时间】:2020-03-03 17:19:12
【问题描述】:
假设我们在仓库上下文中有一个 Order。我们有一个获得该订单的客户。
虽然在 DB 中 Client 有一个 ID 和一堆参数,但我在我的 Order 中将它建模为一个值对象:
class Order extends AggregateRoot {
private client: Client;
private shipping: Shipping;
private items: Array<OrderItem>;
}
class Client extends ValueObject {
public readonly name: string;
public readonly contactPhone: string;
public readonly contactEmail: string;
}
我将其建模为 值对象 的原因很简单——我认为仓库并不关心客户是谁。这些数据主要用于预订快递员,在这种情况下,客户无法真正更改他的姓名或联系方式 - 这将需要调整快递员预订(此时,不妨将其视为完全不同的客户) .
现在我想知道客户端 ID(用于某些分析或可追溯性)实际上会很好。简单:
class Client extends ValueObject {
public readonly name: string;
public readonly contactPhone: string;
public readonly contactEmail: string;
public readonly clientId: DomainID; // or ClientID, not essential
}
然而,令人困惑的一点是:现在这看起来像一个实体(毕竟,我本质上是将不同上下文中的 entity 非规范化为一个 值对象 )。 “身份”在这里没有真正意义,因为在检查 Client 是否相等时,我不会关心 clientId。
换句话说:出于所有实际目的,仓库不关心客户身份。此外,仓库不能更改任何客户详细信息。但是,存在隐含的理解,即我们正在运送给同一个客户 - 具有相同身份的客户。
我可以将Client 建模为值对象吗?这是一个常见的陷阱吗?我只是将“值对象优于实体”规则提升到绝对水平?
【问题讨论】:
-
它不是实体,你的想法是正确的。这只是订单创建时的一些记录细节。
标签: model domain-driven-design denormalization value-objects