您可能要在网页上显示库存水平,或者要显示库存的版本号(假设库存是书籍,杂志等)。此信息来自库存域。
此时要注意的主要事情是您正在谈论一个视图,这就是说使用陈旧数据是可以接受的。
话虽如此,您不需要与聚合(用于防止更改违反业务不变性)进行交互,而只需使用聚合状态的最新副本即可。
因此,我通常希望对产品目录运行查询,对库存运行查询,然后将两者组合到支持视图的DTO中。
是否同时加载产品域和库存域聚合?
这样就近了。我们不需要加载聚合,因为我们不会更改任何内容。但是我们需要他们的状态。所以我们可以加载它。也就是说,我通常希望这两个域在不同的进程中运行。因此,我们将两者都调用,而不是同时加载。
您是否会在“产品”域实体上保留一些属性,以用于库存数量和库存版本,然后在更新库存实体时使用“域事件”来更新这些属性?
“不要越过溪流。那将是不好的。”
使用事件跨领域上下文协调信息:好主意。将属于一个领域的概念推向另一个领域:一个好主意的反面,但更多的则相反。
您想保持域干净。与域交互的应用程序并不重要。因此,例如,库存应用程序调用产品应用程序中的服务以查询某些特定于产品的概念以添加到视图中是合理的。或相反亦然。
我不知道将单个应用程序限制为单个域的任何原因。只要有一个真实的来源,您就可以按照自己喜欢的任何方式分发交易。
但是,请仔细考虑一下,在上面的示例中,我们最终可能会有2个DB表用于产品目录和产品库存。现在,我们在这些产品中使用相同的标识符吗?
那将是简单的方法。大体而言,您使用相同的标识符,因为现实世界中的实体是相同的;两个不同限界上下文的模型是不同的实体,但该模型是不是真实世界的实体。
如果这不起作用,那么您将需要一些查询来弥合差距。我认为最常见的变化是,较新的实体保留了较旧实体的ID。您还将在一个BC中看到这一点:申请人一旦获得批准,便成为客户。这是一个不同的汇总(与客户关联的状态与申请人的状态具有不同的不变性);因此,如果您的持久层使用事件流,则新聚合的流将需要其他标识符。因此,在某处会有一些状态说“此申请人成为此客户”。
或者,我们可以对数据使用1个表行还是1个表行,并将相关数据简单地映射到聚合属性上?
赞! 不,不要那样做。您正在添加事务争用而没有任何业务原因。