比方说,例如,我有一个小部件订购应用程序。它允许客户从小部件目录中订购。明显的对象选择可能是'目录'和'订单'。 'Catalog'对象将允许我浏览,添加和删除小部件。 '订单'对象将允许我创建和更新订单。如何建模应用程序并使多线程需求与封装协调
它们都是多线程安全的并且在内部处理对象锁定和数据库事务。它们被很好地封装/划分 - 直到需求出现时,说明从目录中删除小部件时,包含该小部件的行项目必须从现有订单中删除。
处理这种情况的常见方法是使用观察者模式。换句话说,当零件被删除时,从“目录”中引发事件。调解员然后处理此事件并告诉'订单'删除与该小部件的订单项。
优点:保留封装,松耦合。
缺点:是不是删除的部分和更新的订单一个单一的原子操作?这种技术会违反这一点。换句话说,如果在处理事件时发生错误,则可以在不更新任何订单的情况下移除零件。
我赞成利弊。但是,这只能意味着需要另一个对象 - 一个聚合“目录”和“订单”,并使两个操作都以原子方式执行。问题是每个对象都执行对象锁定和数据库事务,我都不知道如何清理地提取 - 也就是说,在技术上新对象应该现在处理这个责任,因为你不能锁定对象并且执行两次事务并且仍然有一个原子操作。
想法?这是我以前从未见过的经典问题吗?我一直在春天的路上,但我不认为AOP可以在这里做任何事情。
谢谢。
我认为他的问题更多的是关于组件的交叉关注,而不是直接亲子关系的数据。例如,如果您有级联删除,那么如果您必须根据删除子对象执行一些交叉操作,该怎么办?需要提出通知。但是,由于这种担心是交叉的,因此将这些行动纳入同一原子操作的一部分并不合适。这引出了他所提到的问题,即这种缺乏原子性会引起潜在的由其他故障引起的数据不一致。 – 2011-04-12 23:33:15