一个事务中有多个聚合实例
本文关键字:实例 事务 一个 | 更新日期: 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 it
。Applying it to the tree structure
,基本上意味着每个操作find node
和call node's method
,带有必要的参数。这样的CCD_ 11可以修改很多节点。我们需要这样做:apply all operations
或none
(如果有错误)。
根据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() {...}
}
考虑到您的域名:,这是有意义的
同时只能有一个工作树结构,并且可以存在,只要用户想要,直到我们应用它