我有一个父对象,具有多个子对象。每个子对象都是相同类型的,并且有一个"ChildMethod“,其中包含一些特定于子的逻辑。如果对任何子节点调用ChildMethod,我希望序列化所有子级的状态。我将这个逻辑放入父对象中。我也用观察者模式来实现它,孩子是被观察者,父母是观察者。到目前为止效果还不错。现在我需要另一个方法"CallAllChildMethods",它基本上对每个子程序调用ChildMethod,但是我希望避免多次序列化,因为只需要做一次。
我目前看到的唯一解决方案是在调用CallAllChildMethods之前取消订阅所有主题,然后再重新订阅。这是一种很好的设计,但设计的味道很重。从设计的角度来看,是否有更干净的方法来处理这种情况?
发布于 2017-04-02 04:21:14
哦,听起来那个物体已经变得很纠结了。
我会重新评估你的标准。它并不像“每次更改后序列化”那么简单,因为编码太难了,以至于到您的对象设计中只会意味着您以后必须对其进行黑客攻击。
听起来,您想要事务范围的等价物,默认情况下允许您一次执行一个子更改,如果需要,还可以将它们分组到一个事务中。
您可以将这个作用域对象传递给child.Change方法,但是它会很难看。如果您要注入存储库对象来实现保存,则可能会在此上公开一个事务范围。
该事件仍然会触发repository.Save(),但在批处理方法中,您将执行以下操作。
repository.BeginTransaction() //flags Save() to be ignored
foreach(child in childern) {
child.Change(); //calls repository.Save()
}
repository.CommitTransaction() //removes flag and calls Save()很明显,在线程处理和您可能需要考虑的内容方面存在一些复杂性。但你知道
https://softwareengineering.stackexchange.com/questions/345410
复制相似问题