2015-12-19 74 views
2

我在一個事務中遇到多個聚合問題。一個事務中的多個聚合實例

我在樹上構建了很多節點。 節點可以通過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 itApplying it to the tree structure,基本上是指每個操作find nodecall node's method,具有必要的參數。 這樣的working tree structure可以修改很多節點。我們需要這樣做:apply all operationsnone(如果有錯誤)。根據Vaughn Vernon的原理,我們可以在一次交易中創建大量節點。但是我們也需要在這裏修改/刪除同一個事務中的很多節點。
那麼在這種情況下我該怎麼做?

+1

我們錯過了您在此處完成(或未完成)的整個域和事務分析。您的域名如何協作?爲什麼選擇Node作爲一個聚合根?一個'Node'有多少併發訪問?它強制執行哪些不變量?是否曾經發生過一個'Node'被單獨修改,而不是作爲樹結構修改的一部分?等等等等。 – guillaume31

+0

我找到了辦法。我創建了TreeStructure聚合根,它保存對節點的直接引用。每個節點都可以直接引用子節點。 每次請求我都不會從數據庫重新創建整個聚合,因爲它最多可以容納3000個節點,所以我將新的TreeStructure保存在緩存中。 感謝我有一個聚合,它可以自由修改,並回答您的問題併發性在這裏不是問題。 :) – Dariss

回答

0

這裏的操作是命令模式的一個例子,如果我正確地理解了事情。所以它看起來像這樣

class Operation { 

    public void Execlute() { 
     /* modify node here */ 
    } 
} 

如果你這樣實現你的操作,這也意味着你可以指定一個撤消操作。例如像這樣

class DeleteNode : Operation { 

    public override void Execute() { 
     /* delete node here */ 
    } 

    public override void Undo() { 
     /* reinsert node here */ 
    } 
} 

現在你可以這樣

public void ExecuteTransaction(Array<Operation> operations) { 

    bool exception = false; 
    int index = 0; 

    try { 
     for(; index < operations.length; ++index) { 
      operations[i].execute(); 
     } 
    } 
    catch (exception ex) { 
     exception = true; 
    } 

    if (exception) { 
     for(;index >= 0; --index) { 
      operations[index].undo(); 
     } 
    } 
} 

高級閱讀實現您的交易: 根據其語言/工具包/框架您使用的正是他們中的一些可能有支持對於可撤銷的事務,你可能會依賴它。

我喜歡的個人是postsharp http://www.postsharp.net/blog/post/New-in-PostSharp-32-UndoRedo

另往往更容易的方式就是堅持你的數據和將先前的版本,如果你想要做一個回滾

0

骨料應該是樹本身,而不是這些樹的節點。因此,當您更改樹中的一組節點時,事務僅涵蓋一個聚合根(樹),而不是聚合根(各個節點)的集合。

您正處在正確的軌道上。 WorkingTreeStructure類只需要一個「應用」函數,該函數將操作應用於樹的節點並完成工作樹結構。

public class WorkingTreeStructure { 
    private Array<Operation> operations; 

    public void add(Operation operation) {...} 
    public void apply() {...} 
} 

這是有道理的給您的域:

只能有一個在同一時間工作的樹形結構和它 可以,只要用戶需要存在,直到我們申請

相關問題