我有必要让客户端应用程序“锁定”(也就是“签出”某些商业实体存储在数据库中。
工作流程如下:
用户导航到某个业务对象的页面。
用户点击“编辑”。
这会阻止该项目被其他任何人编辑。
其他工作站上的其他用户会看到正在编辑的项目有一个“锁定”图标,“编辑”按钮将是只读的。
管理员用户可以点击按钮“强制”解锁该项目。
非常标准,对吗?我过去已经做过很多次了,这次我正在寻找一些关于“正确”做法的想法......
即,我猜有两种方法:
让我的业务对象实现一些具有LockOwnerId属性的ILockable接口,并使DB中的相应表具有相同的LockOwnerId。
在DB中有一个集中的“EntityLocks”表,用于管理当前锁定/签出的实体的所有实体类型/主键对。
至于获取锁的API,我只是想一下CheckOut方法的内容:
// Returns true if the check-out was successful,
// false if the check-out was not successful, becase the item was already locked. If
// force is set to true, will check out the toCheckOut to the current user, regardless
// of existing check-outs.
bool CheckOut(object toCheckOut, bool force)
思想?
感谢。
答案 0 :(得分:1)
就个人而言,我通常会尝试通过请求更改业务流程来远离此模式。然而,这并非总是可行的,因此Martin Fowler将其描述为an actual pattern.。
你描述的解决方案听起来不错。但是,我宁愿让CheckOut
方法抛出异常,除了返回bool
。这更加明确。当开发人员忘记处理这种特殊情况时(该项目无法检出),错误将更容易被发现(因为没有捕获异常)。
另外,请妥善保管CheckOut
方法的实施。确保它是交易性的。你想要的最后一件事是两个用户都可能锁定同一个对象,因为实现没有正确实现。