如何在工作项更改事件中获取对 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= ???
}
注意:此代码已被精简到最基本的部分,以便于阅读和专注于手头的问题。
我找到了一种方法来做到这一点。它不像我想要的那样优雅,但它确实有效。如果有人有更好的答案,我绝对感兴趣。
以下是对有相同问题的其他人有益的方法。
您可以从传递到事件处理程序的 notificationEventArgs
(WorkItemChangedEvent
类型)的 CoreFields.IntegerFields
集合中获取工作项的 ID。使用它,您可以从 WorkItemStore
的 GetWorkItem
方法中获取 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;
无需连接到项目或工作项存储。它比公认的答案简单一点。
看起来这会非常简单,但我正在努力寻找我需要的东西。
我正在实施 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= ???
}
注意:此代码已被精简到最基本的部分,以便于阅读和专注于手头的问题。
我找到了一种方法来做到这一点。它不像我想要的那样优雅,但它确实有效。如果有人有更好的答案,我绝对感兴趣。
以下是对有相同问题的其他人有益的方法。
您可以从传递到事件处理程序的 notificationEventArgs
(WorkItemChangedEvent
类型)的 CoreFields.IntegerFields
集合中获取工作项的 ID。使用它,您可以从 WorkItemStore
的 GetWorkItem
方法中获取 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;
无需连接到项目或工作项存储。它比公认的答案简单一点。