锁定商业模式

时间:2010-08-16 03:32:09

标签: c# .net database-design orm business-objects

我有必要让客户端应用程序“锁定”(也就是“签出”某些商业实体存储在数据库中。

工作流程如下:

  1. 用户导航到某个业务对象的页面。

  2. 用户点击“编辑”。

  3. 这会阻止该项目被其他任何人编辑。

  4. 其他工作站上的其他用户会看到正在编辑的项目有一个“锁定”图标,“编辑”按钮将是只读的。

  5. 管理员用户可以点击按钮“强制”解锁该项目。

  6. 非常标准,对吗?我过去已经做过很多次了,这次我正在寻找一些关于“正确”做法的想法......

    即,我猜有两种方法:

    1. 让我的业务对象实现一些具有LockOwnerId属性的ILockable接口,并使DB中的相应表具有相同的LockOwnerId。

    2. 在DB中有一个集中的“EntityLocks”表,用于管理当前锁定/签出的实体的所有实体类型/主键对。

    3. 至于获取锁的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)
      

      思想?

      感谢。

1 个答案:

答案 0 :(得分:1)

就个人而言,我通常会尝试通过请求更改业务流程来远离此模式。然而,这并非总是可行的,因此Martin Fowler将其描述为an actual pattern.

你描述的解决方案听起来不错。但是,我宁愿让CheckOut方法抛出异常,除了返回bool。这更加明确。当开发人员忘记处理这种特殊情况时(该项目无法检出),错误将更容易被发现(因为没有捕获异常)。

另外,请妥善保管CheckOut方法的实施。确保它是交易性的。你想要的最后一件事是两个用户都可能锁定同一个对象,因为实现没有正确实现。

祝你好运。