0

我最好从解释我正在尝试做的事情的高级概述开始(以防万一我要解决这个可怕的错误):在 TFS 中,我们有一个包含“优先级”字段的“故事”工作项。在任何给定时间,我们可能有 20-30 个具有优先级的故事。例如,我们可能有 20 个完全优先的故事(1 到 20),然后想要创建一个新的故事,这应该是我们新的首要任务。所以,我希望能够给它优先级 1,然后有一个服务器端插件,它将更新所有其他故事的优先级,这样我最终得到 1 到 21(1 是我们的新故事刚刚创建)。

为此,我为 TFS 2010 创建了一个订阅 WorkItemChangedEvent 的服务器端插件。判断优先级是否已更新是足够聪明的,因此在这种情况下它只会更改工作项。我遇到的问题是,如果我更改优先级并运行 WorkItem.Save(),它会再次触发 WorkItemChangedEvent,并且优先级已更改,因此逻辑为真,它会再次更新并保存。

早些时候,我创建了一个服务器端插件,将其中一个日期时间字段的时间更新为 00:00:00(如果它还不是 00:00:00)并注意到了这种行为。这不是太大的问题,因为在第二次运行时,什么都不会发生,因为时间已经是 00:00:00。但是在这种尝试更新一大堆工作项的优先级的情况下,它是一个交易破坏者。有没有办法阻止 WorkItem.Save() 触发 WorkItemChangedEvent?也许另一种方法可以完全做到这一点?

4

2 回答 2

0

我知道解决此问题的最简单方法是添加特定评论,然后检查工作项的评论/历史记录项,以查看您上次更新它作为您正在进行的更改的一部分。

此外,请查看以下帖子,了解如何创建服务以使其保持稳定

于 2012-04-04T19:16:41.480 回答
0

我通过检查更改者身份是否是服务身份,在我自己的扩展中解决了这个问题。如果是,则跳过逻辑。

这似乎是一个比标记数据更优雅的解决方案。

var workItemChangedArgs = notificationEventArgs as WorkItemChangedEvent;
var identityService = requestContext.GetService<IdentityService>();
var changerIdentity = identityService.ReadIdentities(
    requestContext,
    new List<IdentityDescriptor> {
        IdentityHelper.CreateDescriptorFromSid(workItemChangedArgs.ChangerSid)
    },
    QueryMembership.Expanded,
    null).Single();
if (!IdentityHelper.IsServiceIdentity(requestContext, changerIdentity)) {
    // Do stuff….
}
于 2014-07-17T13:56:57.810 回答