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

本文关键字:实例 事务 一个 | 更新日期: 2023-09-27 18:27:27

我在一个事务中遇到多个聚合的问题。

我在一棵树上有很多节点。节点可以通过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。但也有CCD_ 2的概念。对于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,带有必要的参数。这样的CCD_ 11可以修改很多节点。我们需要这样做:apply all operationsnone(如果有错误)。

根据Vaughn-Vernon的原理,我们可以在一个事务中创建许多节点。但我们也需要在这里修改/删除同一事务中的许多节点
那么在这种情况下我该怎么办呢?

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

如果我理解正确,这里的操作就是命令模式的一个例子。所以它看起来有点像

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();
        }
     }
 }

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

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

另一种通常更简单的方法是,如果您想回滚

,只需持久化数据并加载以前的版本

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

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

public class WorkingTreeStructure {
    private Array<Operation> operations;
    public void add(Operation operation) {...}
    public void apply() {...}
}

考虑到您的域名:,这是有意义的

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