首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止重复事件调用

防止重复事件调用
EN

Software Engineering用户
提问于 2017-04-02 00:52:55
回答 1查看 51关注 0票数 1

我有一个父对象,具有多个子对象。每个子对象都是相同类型的,并且有一个"ChildMethod“,其中包含一些特定于子的逻辑。如果对任何子节点调用ChildMethod,我希望序列化所有子级的状态。我将这个逻辑放入父对象中。我也用观察者模式来实现它,孩子是被观察者,父母是观察者。到目前为止效果还不错。现在我需要另一个方法"CallAllChildMethods",它基本上对每个子程序调用ChildMethod,但是我希望避免多次序列化,因为只需要做一次。

我目前看到的唯一解决方案是在调用CallAllChildMethods之前取消订阅所有主题,然后再重新订阅。这是一种很好的设计,但设计的味道很重。从设计的角度来看,是否有更干净的方法来处理这种情况?

EN

回答 1

Software Engineering用户

发布于 2017-04-02 04:21:14

哦,听起来那个物体已经变得很纠结了。

我会重新评估你的标准。它并不像“每次更改后序列化”那么简单,因为编码太难了,以至于到您的对象设计中只会意味着您以后必须对其进行黑客攻击。

听起来,您想要事务范围的等价物,默认情况下允许您一次执行一个子更改,如果需要,还可以将它们分组到一个事务中。

您可以将这个作用域对象传递给child.Change方法,但是它会很难看。如果您要注入存储库对象来实现保存,则可能会在此上公开一个事务范围。

该事件仍然会触发repository.Save(),但在批处理方法中,您将执行以下操作。

代码语言:javascript
复制
repository.BeginTransaction() //flags Save() to be ignored
foreach(child in childern) {
    child.Change(); //calls repository.Save()
}
repository.CommitTransaction() //removes flag and calls Save()

很明显,在线程处理和您可能需要考虑的内容方面存在一些复杂性。但你知道

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/345410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档