这似乎很简单,但我很难找到我需要的东西。
我正在实现一个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= ???
}
注意:此代码已被删除为裸骨,以便于阅读并专注于手头的问题。
答案 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