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