使用wcf服务实现锁定/编辑/解锁



我正在实现一个服务,它允许用户浏览各种对象,添加新对象,然后保存它们,这是一个非常基本的功能。该服务通过WCF提供,并首先使用EF4代码访问SQL Server数据库的数据。

然而,有一个问题:有一些规则应该一次只允许一个用户处理一个对象,因此标题中提到了锁定-编辑-解锁行为。

假设有一个过滤器,它说"时间戳在日期X和日期Y之间的记录"。现在,用户锁定了这个"过滤器",并且是唯一可以为日期X和日期Y之间的时间范围添加(注意:不能修改!)新记录的用户。

同样值得注意的是,过滤器不是我可以访问的物理实体,因为实际上有无限可能的过滤器。因此,"选择更新"/行锁定是不可能的(我认为!)。此外,过滤器只在固定的时间范围内提供,因此过滤器没有重叠,尽管你可以锁定未来(或过去)的距离没有限制。

到目前为止,我已经提出了一个有效的解决方案,但我对此并不满意。我更喜欢将代码放在我的服务中,而不是在数据库中实现,但欢迎任何建议:

  • 当用户请求锁定时,我首先检查是否已经有一个符合过滤器并设置了"锁定"时间戳的对象。如果存在,则无法再锁定。如果没有,我会创建一个新记录并保存它,以获得该记录的"句柄"(某个id),以便传递回客户端。但是,在执行此操作之前,我会再次运行查询,如果在时间范围内收到多个设置了"锁定"时间戳的记录,则id最高的记录将被视为实际锁定,所有其他记录都将被删除。我觉得这不是特别干净,所以我真的不想用它。

  • 我还想过使用WCF operationcontract属性在任何时候只允许一个调用,但我也不喜欢这样。

当用户试图选择过滤器时,或者当他们试图保存更改时(选择会使Ux更好),我建议检查活动过滤器。为了确定有源滤波器,您需要确保时间步长尚未使用,这可以很容易地完成,如下所示:

公共静态类FilterMonitor{private static Dictionary steps=new Dictionary();

public static bool CheckActiveAddIfNew(TimeStep step)
{
    //Assumes synchronization logic
    bool isActive;
    if(!steps.TryGetValue(step, out isActive)
    {
       steps.Add(step, true);
       isActive = true;
    }
    return isActive;
}
public static bool ChangeFilter(TimeStep oldSetp, TimeStep newStep)
{
   //Synchronization code
   bool ableToChange;
   if(!CheckActiveAddIfNew(newStep))
   {
       steps[newStep] = true;
       steps[oldStep] = false;
       ableToChange = true;
   }
   return ableToChange;
}

}

一旦用户完成了一个过滤器,他们应该释放它,并允许另一个用户获取它(如果他们愿意的话)。这可以通过ChangeFilter方法来实现,该方法只允许他们在其他用户尚未选择新过滤器的情况下选择新过滤器。这样可以确保在任何时候只有一个用户可以访问一个筛选器,从而防止多个用户从同一筛选器添加/删除。

但是,如果您需要多个用户访问同一个TimeRange,但只想允许一个用户向该范围添加/删除记录,只需将Dictionary中的bool替换为映射到一个且仅映射一个用户的user对象即可。这将逻辑从简单的活动/非活动过滤器改变为活动&由User1/Inactive所有。显然,只有User1才能将记录添加到该范围中。

如果你有任何问题,请告诉我。

最新更新