域逻辑 - 读取模型
本文关键字:读取 模型 | 更新日期: 2023-09-27 18:26:48
我有两个聚合。
Person {
private personID personID;
private nodeID nodeID; //belongs to node
}
Node {
private nodeID nodeID; //node's id
private nodeID parent; //parent node reference by id
public void assign(Person person);
}
现在我有分配给服务的人的域逻辑:只有当人属于节点"X"
"Y"
是父母或曾祖父或曾曾祖父或......的节点"X"
。
要找出答案,我需要查询Read Model
。我在域中,所以我不能只使用我的读取模型来查询它。我认为我不能只是添加到我的存储库,连接到读取模型,因为它连接到我的事件存储。特别是,当Read Model
可以放置在另一台服务器上并成为另一个应用程序时。
实施它的正确方法是什么?
以下是禁忌:
只有当他属于节点"Y"时,才能将人员分配给节点"X" 哪个是父母或曾祖父或曾曾祖父或... 节点"X"。
如果它是必须强制执行的约束,则可以在写入端(例如,Graph
(的单独聚合中对层次结构进行建模,其唯一目的是确保完整性。
执行此操作的正确方法是在命令模型中支持祖先检查。这是您要强制实施不变性的地方,因此模型需要支持这一点。
如果您需要能够进行无限的血统检查,树结构通常会导致性能问题。因此,您可能需要实现性能优化来改进这些类型的查询。
我看到了以下可能性:
- 使用直接支持所需查询的数据存储。如果你想做ES,这可能很困难。
- 使用快照。这可能可行,也可能不可行,具体取决于您的树结构。
- 使用缓存。这类似于快照,但将信息存储在缓存中而不是事件存储中。
- 使用读取模型。确保您了解后果,尤其是异步数据传播和增加的复杂性。我只建议将此作为最后的手段,但是 YMMV。