一个事务中的多个聚合实例

时间:2015-12-19 10:11:44

标签: java c# transactions domain-driven-design cqrs

我在一次交易中遇到多个聚合问题。

我在树中构建了很多节点。 Node可以通过id引用其父节点。 Node有很多写方法。

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的原则,我们可以在一个事务中创建大量节点。但是我们也需要在同一个事务中修改/删除很多节点 那么在这种情况下我该怎么做呢?

2 个答案:

答案 0 :(得分: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();
        }
     }
 }

高级阅读 根据您使用的语言/工具集/框架,其中一些可能支持可撤销事务,您可能会依赖它。

我个人喜欢的是后记http://www.postsharp.net/blog/post/New-in-PostSharp-32-UndoRedo

另一种更简单的方法是,如果要进行回滚,只需保留数据并加载以前的版本

答案 1 :(得分:0)

聚合应该是树本身而不是那些树的节点。因此,当您更改树中的节点集合时,事务仅覆盖一个聚合根(树)而不是聚合根(单个节点)的集合。

你走在正确的轨道上。 WorkingTreeStructure类只需要一个&#34; apply&#34;将操作应用于树的节点并最终确定工作树结构的函数。

public class WorkingTreeStructure {
    private Array<Operation> operations;

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

根据您的域名,这是有道理的:

  

同时只能有一个工作树结构   只要用户想要,就可以存在,直到我们应用