TFS 2010:WorkItem.Save再次触发WorkItemChangedEvent

时间:2012-04-03 23:10:10

标签: tfs event-handling tfs2010

我最好首先解释一下我正在尝试做的事情的高级概述(以防我出现这个可怕的错误):在TFS中,我们有一个“故事”工作项,其中包括“优先级” “场。在任何时候,我们可能有20-30个故事优先。作为一个例子,我们可能有20个完美的优先级故事(1到20),然后想要创建一个应该是我们新的首要任务的新故事。所以,我想能够给它一个优先级1,然后有一个服务器端插件,将更新所有其他故事的优先级,以便我最终得到1到21(1是我们的新故事)刚刚创建。)

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

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

2 个答案:

答案 0 :(得分:0)

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

另外,请查看以下post for pointers on how to create your service so that it remains stable

答案 1 :(得分: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….
}