我在一次交易中遇到多个聚合问题。
我在树中构建了很多节点。 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 it
。
Applying it to the tree structure
,基本上对每个操作find node
和call node's method
都有必要的参数。
这样的working tree structure
可以修改很多节点。我们需要这样做:apply all operations
或none
(如果有错误)。
根据Vaughn Vernon的原则,我们可以在一个事务中创建大量节点。但是我们也需要在同一个事务中修改/删除很多节点 那么在这种情况下我该怎么做呢?
答案 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() {...}
}
根据您的域名,这是有道理的:
同时只能有一个工作树结构 只要用户想要,就可以存在,直到我们应用它