3

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

我正在实现一个 TFS 2013 事件处理程序,并且只想获取对引发更改事件的工作项的引用。获得标题似乎很容易,但我无法在事件签名对象中找到一个属性或方法,这些属性或方法给了我对 WorkItem 对象的引用或我需要去查询它的信息(例如 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= ???
    }

注意:此代码已被精简为基本内容,以使其更易于阅读并专注于手头的问题。

4

3 回答 3

2

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

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

您可以从传递给事件处理程序的(类型)的CoreFields.IntegerFields集合中获取工作项的 ID 。使用它,您可以从's方法中获取。notificationEventArgsWorkItemChangedEventWorkItemWorkItemStoreGetWorkItem

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

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);
于 2015-01-25T23:21:35.953 回答
1

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

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

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

于 2017-12-08T23:23:23.973 回答
0

因此,您在事件中得到的只是一些核心字段和更改的值。在事件处理程序的开头执行此操作

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

所以请注意 settings.TFSServerURL 这是在与 DLL 一起使用的 app.config 中。我正在使用两个 TFS 服务器,但是在执行这 3 行之后,您可能会硬编码 TFS Url 您现在可以执行此操作

eventWorkItem = wiStore.GetWorkItem(workItemId);

这将使您可以访问具有所有属性的完整工作项。

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

eventWorkItem.Fields["Activity Date"].Value
于 2015-01-28T15:58:00.510 回答