2012-04-03 2 views
0

내가 뭘 하려는지에 대한 개요를 설명하는 것이 좋을 것입니다. (단지이 끔찍한 잘못에 대해 생각하고 있습니다.) TFS에서는 "스토리"작업 항목에는 "우선 순위"필드가 포함됩니다. 주어진 시간에 우리는 20-30 개의 이야기를 우선적으로 가지고 있습니다. 예를 들어 20 가지의 우선 순위가있는 이야기 (1 ~ 20)를 작성한 다음 우리의 새로운 최우선 과제가 될 새로운 이야기를 만들고 싶습니다. 그래서, 우선 순위를 1로 할 수 있기를 바란다. 그런 다음 서버 측 플러그인을 사용하여 다른 모든 스토리의 우선 순위를 업데이트하여 1에서 21까지 끝난다. (1은 새로운 스토리이다. 방금 만든).TFS 2010 : WorkItem.Save가 WorkItemChangedEvent를 다시 트리거합니다.

이 기사에서는 WorkItemChangedEvent를 구독하는 TFS 2010 용 서버 측 플러그인을 만들었습니다. 우선 순위가 업데이트되었는지 여부를 파악할만큼 똑똑하기 때문에이 경우 작업 항목 만 변경됩니다. 문제는 내가 우선 순위를 변경하고 WorkItem.Save()를 실행하면 WorkItemChangedEvent를 다시 트리거하고 우선 순위가 변경되어 논리가 true가되고 업데이트되고 다시 저장된다는 것입니다.

이전에 datetime 필드 중 하나의 시간을 00:00:00 (이미 00:00:00이 아닌 경우)로 업데이트하고이 동작을 감지 한 서버 측 플러그인을 만들었습니다 . 시간이 벌써 00:00:00이 되었기 때문에 두 번째 실행에서 아무 일도 일어나지 않을 것이기 때문에 너무 큰 문제는 아니 었습니다. 그러나 작업 항목 전체에서 우선 순위를 업데이트하려는이 경우에는 거래 차단 자입니다. WorkItem.Save()가 WorkItemChangedEvent를 트리거하는 것을 막을 수있는 방법이 있습니까? 이 일을 함께하는 다른 방법이 있을까요?

답변

0

가장 쉬운 방법은 특정 의견을 추가 한 다음 작업 항목의 메모/기록 항목을 점검하여 수행중인 변경의 일부로 마지막으로 업데이트했는지 확인하는 것입니다.

또한 post for pointers on how to create your service so that it remains stable을 확인하십시오.

+0

아무도 더 좋은 해결책이 제시되지 않으면 답으로 표시하겠습니다. 효과가 있지만 깨끗한 방법이 없다면 너무 나쁩니다. – ctb

+0

나는 더 나은 솔루션을 원합니다. 어쩌면 당신은 tfs aggregator의 소스에서 뭔가를 찾을 수 있습니다. http://tfsaggregator.codeplex.com/ – jessehouwing

+1

시간의 이익을 위해이 경로를 끝내게되었습니다. 우선 순위 필드와 부울 필드를 업데이트 한 곳에서 하나의 저장 작업을 수행해야합니다. 그러면 처리기는 부울이 참인 모든 사례를 무시할 수 있습니다. 그런 다음 부울을 다시 false로 설정 한 두 번째 저장 작업을 수행했습니다. 이 경우 우선 순위가 변경되지 않았으므로 다시 아무 것도 발생하지 않습니다. – ctb

0

교환기 신원이 서비스 신원인지 확인하여 본인의 연장으로이 문제를 해결했습니다. 그렇다면 논리는 건너 뜁니다.

이것은 데이터를 태그 지정하는 약간 더 우아한 해결책과 같습니다.

var workItemChangedArgs = notificationEventArgs as WorkItemChangedEvent; 
var identityService = requestContext.GetService<IdentityService>(); 
var changerIdentity = identityService.ReadIdentities(
    requestContext, 
    new List<IdentityDescriptor> { 
     IdentityHelper.CreateDescriptorFromSid(workItemChangedArgs.ChangerSid) 
    }, 
    QueryMembership.Expanded, 
    null).Single(); 
if (!IdentityHelper.IsServiceIdentity(requestContext, changerIdentity)) { 
    // Do stuff…. 
} 
+0

그래, 이건 더 좋은 생각 같아. 솔직히, 나는 그것을 고려하지 않았다고 믿는 데 어려움을 겪고있다. (이것은 오래전 일이었고 나의 기억은 퍼지다.) 나는 어떤 종류의 문제에 빠지거나 잡았다 고 생각한다 ... 나는 가질 것이다. 코드를 다시 방문하여 설명대로 리팩토링 할 수 있는지 확인하십시오. – ctb