2011-11-22 2 views
4

내 프로젝트는 우리가 관리하지 않는 TFS 서버에 프로그래밍 방식으로 액세스하고 WorkItemTypes의 필드에 대한 실시간 정보를 얻도록 요구합니다. WorkItemType의 FieldDefinitions 컬렉션에서 FieldDefinition을보고 필요한 필드 이름과 정보를 얻을 수 있습니다.TFS WorkItem 필드가 필요한지 프로그래밍 방식으로 결정할 수 있습니까?

public WitType(WorkItemType type) 
    { 
     this.Fields = new List<string>(); 

     foreach (FieldDefinition f in type.FieldDefinitions) 
     { 
      Fields.Add(f.Name); 
     } 
    } 

한가지 빠진 것은 IsRequired 속성입니다. 필드가 필요한지 여부를 알 수 있어야합니다. 내가 작업 항목 이야기 쿼리를

WorkItemCollection workItemCollection = workItemStore.Query 
foreach (WorkItem workItem in workItemCollection) 
foreach (Field field in workItem.Fields) 
{ 
    textBox1.Text += field.Name + " is required? " + field.IsRequired.ToString();     
} 

를 실행 한 후 WorkItem에서의 필드 컬렉션의 필드 항목의 애드 팍의 속성을 확인 노력했다. 주어진 작업 항목 유형에 대해 하나의 작업 항목에 제목이 필요하다고 표시되면 다음 작업 항목의 IsRequired 속성은 false로 설정됩니다.

WIT xml 파일을 사용하지 않고 WorkItem 필드가 필요한지 확인하는 방법이 있습니까? 그렇지 않으면 프로그래밍 방식으로 WIT XML 파일에 액세스하는 방법이 있습니까?

+0

내가 TFS의 기압에 액세스 할 수없는 옵션 1과 옵션을 수행하는 방법에 대한 예입니다 만, 빈 작업 항목의 유효성 검사를 시도하십시오. http://msdn.microsoft.com/en-us/library/microsoft.teamfoundation.workitemtracking.client.workitemtype.aspx – Prescott

+0

TFS 사람들과 대화를 나누면 방법이 있다고 생각하는 것 같습니다. 손을 알지 못했다. 또한, 나는 깨닫지 못했지만 당신이 누구인지에 따라 필드가 다를 수 있습니다. 나는 국가가 필수 분야의 결정자라고 생각했다. 그럴 가능성이 더 높습니다. 이번 주말에 조사 할 시간을 좀 갖도록하겠습니다. – Prescott

+0

프레스콧에게 다시 감사드립니다. 필드가 일부 사용자에게는 필요하고 다른 사용자에게는 필요하지 않음을 알았습니다. 이것이 Microsoft가 FieldDefinition 클래스의 속성으로 포함시키지 않은 이유입니다. 엄격한 true/false 필드가 아니기 때문입니다. –

답변

1

비슷한 작업을 수행 할 필요가 있었으며이를 수행하는 방법을 알아낼 수있는 유일한 방법은 다음과 같습니다.

다른 사람이 언급했듯이 WorkItem 유효성 검사는 WorkItemType의 템플릿에 정의되어 있습니다. 필드는 WorkItem의 현재 상태와 현재 사용자의 권한에 따라 다른 유효성 검사 요구 사항을 가질 수 있습니다.

따라서 사용자의 자격 증명을 사용하여 WorkItem 인스턴스를 만들고 검색해야합니다. 응용 프로그램이 현재 사용자 (즉, Windows 인증 및 가장을 사용하는 ASP.NET 응용 프로그램)를 사칭하는 경우 TFS API를 사용하여 가장을 사용하지 않고 WorkItem을 가져 오는 옵션 1을 간단히 사용할 수 있습니다.

응용 프로그램이 사용자를 가장하지 않으면 TFS 가장 기능을 사용하는 옵션 2를 사용하여 사용자의 온 - 동작을 호출 할 수 있습니다. 이를 위해서는 TFS의 "다른 사람들의 행동에 대한 요청 만들기"권한을 응용 프로그램의 ID (즉, ASP.NET에서 응용 프로그램 풀의 ID)에 부여해야합니다. 자세한 내용은 다음 링크를 참조하십시오 : http://blogs.microsoft.co.il/blogs/shair/archive/2010/08/23/tfs-api-part-29-tfs-impersonation.aspx

다음 코드가 있다면 무엇을 2

 // Set the following variables accordingly 
     string workItemTypeName = "Bug"; 
     string teamProjectName = "My Project"; 
     string usernameToImpersonate = "joesmith"; 
     string tfsTeamProjectCollectionUrl = "http://mydomain.com:8080/tfs/ProjectCollectionName"; 

     // OPTION 1: no impersonation. 
     // Get an instance to TFS using the current thread's identity. 
     // NOTE: The current thread's identity needs to have the "" permision or else you will receive 
     //  a runtime SOAP exception: "Access Denied: [username] needs the following permission(s) to perform this action: Make requests on behalf of others" 
     TfsTeamProjectCollection tfs = new TfsTeamProjectCollection(new Uri(tfsTeamProjectCollectionUrl)); 
     IIdentityManagementService identityManagementService = tfs.GetService<IIdentityManagementService>(); 

     // OPTION 2: impersonation. Remove the following two lines of code if you don't need to impersonate. 
     // Get an instance to TFS impersonating the specified user. 
     // NOTE: This is not needed if the current thread's identity is that of the user 
     //  needed to impersonate. Simple use the ablve TfsTeamProjectCollection instance 
     TeamFoundationIdentity identity = identityManagementService.ReadIdentity(IdentitySearchFactor.AccountName, usernameToImpersonate, MembershipQuery.None, ReadIdentityOptions.None); 
     tfs = new TfsTeamProjectCollection(tfs.Uri, identity.Descriptor); 

     WorkItem workItem = null; 
     WorkItemStore store = tfs.GetService<WorkItemStore>(); 

     // Determine if we are creating a new WorkItem or loading an existing WorkItem. 
     if(workItemId.HasValue) { 
      workItem = store.GetWorkItem(workItemId.Value); 
     } 
     else { 
      Project project = store.Projects[ teamProjectName ]; 
      WorkItemType workItemType = project.WorkItemTypes[ workItemTypeName ]; 
      workItem = new WorkItem(workItemType); 
     } 

     if(workItem != null) { 

      foreach(Field field in workItem.Fields) { 
       if(field.IsRequired) { 
       // TODO 
       } 
      } 
     } 
+0

기존 workItem을 가져 오는 방법을 볼 수 있도록 workItemId를 예제로 추가했습니다. 응용 프로그램에서 기존 작업 항목 편집을 지원하는 경우 기존 작업 항목을 가져와 필요한 필드를 확인해야 할 때가 있습니다. 작업 항목 상태에 따라 다른 필드가 필요할 수 있습니다 (예 :활성, 해결됨, 보류 중 등). 새로운 작업 항목 만 항상 생성하고 있다면 그렇습니다. if (workItemId.HasValue) –

관련 문제