用于处理撤消和通知的体系结构

时间:2011-01-13 15:24:04

标签: architecture notifications undo

我目前正在设计一个复杂的网站,需要支持CRUD操作的撤消和通知。

通过撤消,我的意思是用户可以创建/修改/删除项目,然后决定取消他所做的事情(因此删除创建的项目,恢复修改项目的先前状态,或者带回已删除的项目)。在执行该操作后,他可以暂时执行此操作(超时为2分钟,因为系统相当复杂,用户可能需要一些时间才能注意到修改不正确)。

通过通知,我的意思是,当创建/修改/删除项目时,对该项目感兴趣的其他用户将收到现场通知(下次加载新页面时) )如果他们要求,也会收到电子邮件或短信通知。

完成任一功能很简单:撤消涉及保留撤消信息(主要是旧版本的修改或删除的项目),而通知就像将通知对象推送到适当的表并发送电子邮件/ SMS一样简单苍蝇

让他们两个人一起工作会产生很多额外的复杂性,因为通知必须保持停滞,直到Undo变得不可能为止,而且我没有足够的后见之明来以合理的方式设计它。

构建此类系统时应避免哪些模式,最佳做法或陷阱?

2 个答案:

答案 0 :(得分:0)

我会考虑使用Command Pattern进行撤消(可能在超时到期之前不会持续)Observer Pattern用于通知。

EDIT1:反思,我可能会立即坚持下去。否则,您会在超时到期之前解决用户会话的问题。

EDIT2:另一种选择是使用Windows Workflow Foundation 4(WF4)和Compensation。将长时间运行的持久性工作流设置为WCF服务。工作流可以只是启动它的WCF接收活动,延迟活动和发送通知的自定义活动;您可能甚至不需要CompensableActivity(如果延迟尚未过期且通知尚未发送,则无需撤消)。每个通知请求都会进行WCF调用以启动新的工作流实例。如果用户取消,则中止实例。 (使用Delay和另一个WCF Receive活动可能更容易,如果被调用则取消通知。)警告:我没有实现这样的系统。

答案 1 :(得分:0)

基于对思想和代码的一些实验,我设法提取了一系列原则。

  • 用户可以通过单击取消按钮或执行反向操作(例如删除其注释)来取消操作。从通知的角度来看,没有理由以不同的方式对待这两种情况。
  • 大约在同一时间发生的同一个对象的通知应该尽可能地组合在一起:显示“A评论你的帖子”没有意义......“Z评论你的帖子”而不是“A,B ......和Z评论了你的帖子”。因此,创建和删除通知应根据分组规则组合在一起:如果它们足够靠近,则它们相互抵消。
  • 由于取消的可能性,请勿立即发送通知电子邮件。等一下两分钟。如果取消操作,则创建和删除组规则将删除未发送的通知,同时它仍处于待处理状态。当然,如果用户当前已连接,您可以实时显示通知,因为与电子邮件不同,实时通知可以“收回”。

基于这些原则,我决定在数据访问层之上构建两个不同的层:

  • 一组具有语义意义的操作,例如“发布新评论”或“删除评论”,然后将其连线以发送通知。
  • 撤消启用操作对的定义:“发布新评论”的“撤消”方面是“删除评论”。

这样,操作总是通过基本操作集,从而触发通知,这些通知不知道它们是由取消先前操作还是手动运行其反向操作引起的 - 系统通过以下方式巧妙地处理有关同一对象的多个通知将它们组合在一起并让它们相互抵消。

相反,“撤消”设施只是从语义层调用代码,而不需要任何有关发送通知的知识。

显然,仍然会有少量耦合,因为有时需要添加语义操作,因为它是现有操作的“撤消”反转。例如,可以取消创建讨论,但是一旦发送消息就无法删除消息(因为可能会有消息回复)。因此,在cancelDiscussion不可用的情况下,可能存在deleteDiscussion函数。我怀疑这种情况很少见,无法安全接受。