2012-07-09 81 views
0

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

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

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

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

我想出了一个迄今为止工作的解决方案,但我对此并不满意。我喜欢有,而不是某个数据库实现这个在我的服务代码,但任何建议,欢迎:

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

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

+0

因此,每个过滤器实际上是对这个数据库的查询,对吗? – Chris 2012-07-09 13:17:27

+0

@Chris是的,你是对的! – UrbanEsc 2012-07-09 15:00:33

+0

如果有两个过滤器触及相同的记录,会发生什么情况?你如何决定哪个过滤器获得记录? – Chris 2012-07-09 17:21:05

回答

0

我会建议更换检查有源滤波器既可以当用户试图选择一个过滤器,或者当他们试图保存更改(选择做一个更好的UX)。为了确定有源滤波器,你需要确保时间步长是不是已经在使用,它可以很容易地像这样来完成:

公共静态类FilterMonitor { 私有静态字典步骤=新词典( );

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,但只希望允许单个用户向该范围添加/删除记录,则只需替换字典中的bool,该用户对象映射到一个且仅限于一个用户。这将逻辑从简单的活动/非活动过滤器更改为由User1/Inactive拥有的活动&。显然只有用户1将被允许添加记录到该范围。

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

+0

我不确定我是否正确理解你。这段代码去哪里?在服务器端或客户端? – UrbanEsc 2012-07-10 07:40:16

+0

这将在服务器端实现,客户端将通过服务器传递其过滤器更改请求。 – Chris 2012-07-10 13:44:55