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

时间:2015-01-25 04:05:11

标签: c# tfs tfs-workitem tfs-events

这似乎很简单,但我很难找到我需要的东西。

我正在实现一个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= ???
    }

注意:此代码已被删除为裸骨,以便于阅读并专注于手头的问题。

3 个答案:

答案 0 :(得分:2)

我找到了一种方法来做到这一点。它并不像我喜欢的那样优雅,但它有效。如果有人有更好的答案我真的很感兴趣。

这是为了其他任何有相同问题的人的利益。

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

注意:您想要的项目的字段名称为" 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);

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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