我在一個事務中遇到多個聚合問題。一個事務中的多個聚合實例
我在樹上構建了很多節點。 節點可以通過id引用他的父節點。節點有很多寫入方法。
public class Node {
private NodeID nodeID;
public void changeNodeData(NodeData nodeData);
public void changeParent(Node node);
public void changeType(Type type);
//... next write methods
}
我們可以從節點構建tree structure
。 但有working tree structure
的概念。 至working tree structure
,您可以add operations
,這只是您可以在節點上執行的操作。例如ChangeParentOperation
public class WorkingTreeStructure {
private Array<Operation> operations;
public void add(Operation operation);
}
有可在同一時間只有一個working tree structure
,它可以,只要用戶需要存在,直到我們apply it
。 Applying it to the tree structure
,基本上是指每個操作find node
和call node's method
,具有必要的參數。 這樣的working tree structure
可以修改很多節點。我們需要這樣做:apply all operations
或none
(如果有錯誤)。根據Vaughn Vernon的原理,我們可以在一次交易中創建大量節點。但是我們也需要在這裏修改/刪除同一個事務中的很多節點。
那麼在這種情況下我該怎麼做?
我們錯過了您在此處完成(或未完成)的整個域和事務分析。您的域名如何協作?爲什麼選擇Node作爲一個聚合根?一個'Node'有多少併發訪問?它強制執行哪些不變量?是否曾經發生過一個'Node'被單獨修改,而不是作爲樹結構修改的一部分?等等等等。 – guillaume31
我找到了辦法。我創建了TreeStructure聚合根,它保存對節點的直接引用。每個節點都可以直接引用子節點。 每次請求我都不會從數據庫重新創建整個聚合,因爲它最多可以容納3000個節點,所以我將新的TreeStructure保存在緩存中。 感謝我有一個聚合,它可以自由修改,並回答您的問題併發性在這裏不是問題。 :) – Dariss