我目前正在设计一个复杂的网站,需要支持CRUD操作的撤消和通知。
通过撤消,我的意思是用户可以创建/修改/删除项目,然后决定取消他所做的事情(因此删除创建的项目,恢复修改项目的先前状态,或者带回已删除的项目)。在执行该操作后,他可以暂时执行此操作(超时为2分钟,因为系统相当复杂,用户可能需要一些时间才能注意到修改不正确)。
通过通知,我的意思是,当创建/修改/删除项目时,对该项目感兴趣的其他用户将收到现场通知(下次加载新页面时) )如果他们要求,也会收到电子邮件或短信通知。
完成任一功能很简单:撤消涉及保留撤消信息(主要是旧版本的修改或删除的项目),而通知就像将通知对象推送到适当的表并发送电子邮件/ SMS一样简单苍蝇
让他们两个人一起工作会产生很多额外的复杂性,因为通知必须保持停滞,直到Undo变得不可能为止,而且我没有足够的后见之明来以合理的方式设计它。
构建此类系统时应避免哪些模式,最佳做法或陷阱?
答案 0 :(得分:0)
我会考虑使用Command Pattern进行撤消(可能在超时到期之前不会持续)和Observer Pattern用于通知。
EDIT1:反思,我可能会立即坚持下去。否则,您会在超时到期之前解决用户会话的问题。
EDIT2:另一种选择是使用Windows Workflow Foundation 4(WF4)和Compensation。将长时间运行的持久性工作流设置为WCF服务。工作流可以只是启动它的WCF接收活动,延迟活动和发送通知的自定义活动;您可能甚至不需要CompensableActivity(如果延迟尚未过期且通知尚未发送,则无需撤消)。每个通知请求都会进行WCF调用以启动新的工作流实例。如果用户取消,则中止实例。 (使用Delay和另一个WCF Receive活动可能更容易,如果被调用则取消通知。)警告:我没有实现这样的系统。
答案 1 :(得分:0)
基于对思想和代码的一些实验,我设法提取了一系列原则。
基于这些原则,我决定在数据访问层之上构建两个不同的层:
这样,操作总是通过基本操作集,从而触发通知,这些通知不知道它们是由取消先前操作还是手动运行其反向操作引起的 - 系统通过以下方式巧妙地处理有关同一对象的多个通知将它们组合在一起并让它们相互抵消。
相反,“撤消”设施只是从语义层调用代码,而不需要任何有关发送通知的知识。
显然,仍然会有少量耦合,因为有时需要添加语义操作,因为它是现有操作的“撤消”反转。例如,可以取消创建讨论,但是一旦发送消息就无法删除消息(因为可能会有消息回复)。因此,在cancelDiscussion
不可用的情况下,可能存在deleteDiscussion
函数。我怀疑这种情况很少见,无法安全接受。