域逻辑 - 读取模型

本文关键字:读取 模型 | 更新日期: 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。