0

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

但是有一个问题:有一些规则应该让一个用户一次只能处理一个对象,因此标题中提到了锁定编辑解锁行为。

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

还值得注意的是,过滤器不是我可以访问的物理实体,因为实际上有无限可能的过滤器。因此,“选择更新”/行锁定是不可能的(我认为!)。此外,过滤器仅在固定的时间范围步骤中可用,因此过滤器没有重叠,尽管您可以锁定未来(或过去)的距离没有限制。

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

  • 当用户请求锁定时,我首先检查是否已经存在符合过滤器并设置了“锁定”时间戳的对象。如果有,则不可能再有一个锁。如果没有,我创建一个新记录并将其保存以获取此记录的“句柄”(一些 id)以传回给客户端。但是,在我这样做之前,我再次运行查询,如果我在设置了“锁定”时间戳的时间范围内收到多个记录,则具有例如最高 id 的记录将计为实际锁定,所有其他记录将被删除。我认为这不是特别干净,所以我真的不想使用它。

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

4

1 回答 1

0

我建议在用户尝试选择过滤器或尝试保存更改时检查活动过滤器(选择使用户体验更好)。为了确定有源滤波器,您需要确保尚未使用时间步长,这可以像这样轻松完成:

public static class 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 对象。这会将逻辑从简单的活动/非活动过滤器更改为用户1/非活动的活动和拥有。显然,只允许 User1 将记录添加到该范围。

请让我知道,如果你有任何问题。

于 2012-07-09T22:43:48.677 回答