如何在工作项更改事件中获取对 TFS 工作项的引用?

How can I get a reference to the TFS WorkItem in a WorkItemChangedEvent?

看起来这会非常简单,但我正在努力寻找我需要的东西。

我正在实施 TFS 2013 事件处理程序,只是想获得对引发更改事件的工作项的引用。获得标题似乎很容易,但我无法在事件签名 object 中找到 属性 或方法来给我对 WorkItem object 或信息的引用我需要去查询它(例如ID)。

public EventNotificationStatus ProcessEvent(
         TeamFoundationRequestContext requestContext, 
         NotificationType notificationType, 
         object notificationEventArgs, 
         out int statusCode, 
         out string statusMessage, 
         out ExceptionPropertyCollection properties)
    {          
        var ev = notificationEventArgs as WorkItemChangedEvent;
        string WorkItemTitle = ev.WorkItemTitle; /* easy enough */

        /*********** need help with this bit *********/
        int ChangedWorkItemID = ???
              OR
        WorkItem ChangedWorkItem= ???
    }

注意:此代码已被精简到最基本的部分,以便于阅读和专注于手头的问题。

我找到了一种方法来做到这一点。它不像我想要的那样优雅,但它确实有效。如果有人有更好的答案,我绝对感兴趣。

以下是对有相同问题的其他人有益的方法。

您可以从传递到事件处理程序的 notificationEventArgsWorkItemChangedEvent 类型)的 CoreFields.IntegerFields 集合中获取工作项的 ID。使用它,您可以从 WorkItemStoreGetWorkItem 方法中获取 WorkItem

注意:您想要的项目的字段名称为 "ID",它似乎始终是集合中的元素 0,但我不相信它总是正确的,所以我搜索了名称 属性 使用 LINQ 以防万一。这是整个事件的代码片段。

IntegerField idField =  ev.CoreFields.IntegerFields
                          .Where<IntegerField>(field => field.Name.Equals("ID"))
                          .FirstOrDefault<IntegerField>();

int WorkItemID=  idField.NewValue;

//Assuming you have an initialized WorkItemStore Object here
 workItemStore.GetWorkItem(WorkItemID);

所以你在活动中得到的只是一些核心字段和变化的值。在事件处理程序的开头执行此操作

Uri projectCollectionUri = new Uri(settings.TFSServerURL + projectCollectionFolder);
TfsTeamProjectCollection projectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(projectCollectionUri);
WorkItemStore wiStore = projectCollection.GetService<WorkItemStore>();

所以请注意 settings.TFSServerURL 这是在 DLL 附带的 app.config 中。我当时使用了两个 TFS 服务器,但是您可以 cough 硬编码 TFS Url cough 完成这 3 行后,您现在可以做到这一点

eventWorkItem = wiStore.GetWorkItem(workItemId);

这将使您能够访问完整的工作项及其所有 属性。

要访问核心字段以外的字段,例如,以这种方式访问​​它们

eventWorkItem.Fields["Activity Date"].Value

您可以使用以下代码获取ID:

// Get the ID of the work item that was just changed by the user.
int workItemId = ev.CoreFields.IntegerFields[0].NewValue;

无需连接到项目或工作项存储。它比公认的答案简单一点。