2015-01-25 3 views
3

이렇게 간단한 것 같지만 필요한 것을 찾기 위해 고심하고 있습니다.WorkItemChangedEvent에서 TFS WorkItem에 대한 참조를 얻으려면 어떻게해야합니까?

저는 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= ??? 
    } 

참고 :이 코드가 쉽게 읽고 손에서 문제에 초점을 맞출 수 있도록 맨손으로 뼈까지 제거되었습니다.

답변

2

이 방법이 있습니다. 내가 원했던만큼 우아하지는 않지만 작동합니다. 누구든지 더 나은 대답을한다면 분명 관심이 있습니다.

다음은 동일한 질문을 가진 다른 사람의 이익을 위해 작동 한 내용입니다.

notificationEventArgs (WorkItemChangedEvent) CoreFields.IntegerFields 컬렉션의 작업 항목 ID를 이벤트 처리기로 전달할 수 있습니다. 이를 사용하면 WorkItemStoreGetWorkItem 방법에서 WorkItem을 얻을 수 있습니다.

참고 : 원하는 항목의 필드 이름은 "ID"이며 컬렉션의 요소 0으로 표시되지만 항상 true라는 것을 신뢰하지 않아서 name 속성을 검색했습니다. 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); 
0

따라서 이벤트의 핵심 항목과 변경된 값은 일부입니다. 이벤트 핸들러의 시작 부분에서이

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

그래서 이것은 DLL로가는의 app.config에있는 settings.TFSServerURL을 발견 할. 이렇게하면 전체 작업에 액세스 할 수 있습니다 나는 두 TFS 서버를 사용했다,하지만 당신은 잠재적으로 기침 하드 코드 당신이 그 3 선을 한 후 TFS URL 기침, 당신은 지금이

eventWorkItem = wiStore.GetWorkItem(workItemId); 

을 할 수 있습니다 그것의 재산 전부를 가진 품목. 프로젝트에 연결하지 않고도

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

:

핵심 필드 액세스 그들에게 다음과 같은 코드를 사용하여 ID를 얻을 수

eventWorkItem.Fields["Activity Date"].Value 
+0

이 대답은 workItemId가 있다고 가정합니다. 나는 그 정보로 작업 항목을 얻는 방법을 안다. 문제는 그것을 멀리하는 것입니다. – JohnFx

+0

당신이 자기 대답에서 알아 낸 것. WorkItemChangedEvent로 캐스팅해야합니다. intellisence 및 속성 매핑을 얻으려면. – Etienne

1

예를 들어이 방법 이외의 필드에 액세스하려면 또는 작업 항목 저장소. 허용 된 답변보다 조금 간단합니다.

관련 문제