Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 锁定业务模式_C#_.net_Database Design_Orm_Business Objects - Fatal编程技术网

C# 锁定业务模式

C# 锁定业务模式,c#,.net,database-design,orm,business-objects,C#,.net,Database Design,Orm,Business Objects,我需要客户机应用程序“锁定”(也称为“签出”)数据库中存储的某些业务实体 工作流程如下所示: 用户导航到某个业务对象的页面 用户点击“编辑” 这将锁定项目,使其不被任何其他人编辑 其他工作站上的其他用户将在正在编辑的项目旁看到一个小“锁定”图标,“编辑”按钮将为只读 管理员用户可以单击按钮“强制”解锁项目 相当标准,对吧?我在过去做过很多次,我正在寻找一些关于“正确”做这件事的方法的想法 也就是说,我想有两种方法: 让我的业务对象实现一些ILockable接口,该接口具有LockOwnerId属

我需要客户机应用程序“锁定”(也称为“签出”)数据库中存储的某些业务实体

工作流程如下所示:

  • 用户导航到某个业务对象的页面

  • 用户点击“编辑”

  • 这将锁定项目,使其不被任何其他人编辑

  • 其他工作站上的其他用户将在正在编辑的项目旁看到一个小“锁定”图标,“编辑”按钮将为只读

  • 管理员用户可以单击按钮“强制”解锁项目

  • 相当标准,对吧?我在过去做过很多次,我正在寻找一些关于“正确”做这件事的方法的想法

    也就是说,我想有两种方法:

  • 让我的业务对象实现一些ILockable接口,该接口具有LockOwnerId属性,并且数据库中的相应表具有相同的LockOwnerId

  • 在数据库中有一个集中的“EntityLocks”表,用于管理当前锁定/签出的所有实体类型/主键对

  • 至于获取锁的API,我只是简单地考虑一些类似于签出方法的东西:

    // 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)
    
    想法


    谢谢。

    就我个人而言,如果可能的话,我通常会尝试通过请求更改业务流程来远离这种模式。但是,这并不总是可能的,因此Martin Fowler将其描述为

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

    另外,请注意
    CheckOut
    方法的实现。确保它是事务性的。您最不希望看到的是两个用户都在同一个对象上获得了锁,因为实现没有正确实现


    祝你好运。

    就我个人而言,如果可能的话,我通常会尝试通过请求更改业务流程来远离这种模式。然而,这并不总是可能的,因此Martin Fowler将其描述为

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

    另外,请注意
    CheckOut
    方法的实现。确保它是事务性的。您最不希望看到的是两个用户都在同一个对象上获得了锁,因为实现没有正确实现


    祝你好运。

    我知道你说的是一个Web应用程序。那将非常困难。这只是因为用户可以点击“编辑”并从你的页面导航出去,在会话到期之前你永远不会知道它是否仍在编辑。至少在会话期间锁定你的实体。更好的是,我说的是ap具有web前端和Silverlight客户端前端(通过WCF与服务器通信)的应用程序。此模式称为悲观脱机锁定:。我知道您说的是一个Web应用程序。这将非常困难。这只是因为用户可以点击“编辑”并从您的页面导航,并且在会话到期之前,您永远不会知道它是否仍在编辑。至少在会话期间锁定您的实体。更好的是,我所说的应用程序同时具有web前端和Silverlight客户端前端(通过WCF与服务器通信)。此模式称为悲观脱机锁:。