2011-11-22 57 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();     
} 

,然後檢查領域項目的工作項的字段集合中的IsRequired財產。 唯一的問題是,對於給定的工作項類型,一個工作項說Title是必需的,那麼下一個工作項將具有IsRequired屬性= false。

有沒有辦法確定是否需要一個WorkItem字段而不訴諸WIT XML文件?如果沒有,有沒有辦法以編程方式訪問WIT xml文件?

+0

我沒有訪問TFS個大氣壓,但如果你嘗試驗證一個空的工作項目http://msdn.microsoft.com/en-us/library/microsoft.teamfoundation.workitemtracking.client.workitemtype.aspx – Prescott

+0

與我們的TFS傢伙交談,他們似乎認爲有一種方式,但不知道手。此外,我沒有意識到,但取決於你所需的領域可能不同。我認爲國家是必需領域的決定因素。這可能會使這變得更加困難。我會盡力找到這個週末的一些時間來調查 – Prescott

+0

再次感謝普雷斯科特的幫助。我確實看到,某些用戶可能需要這些字段,而其他用戶則不需要。我假設這就是爲什麼微軟沒有將它作爲FieldDefinition類的屬性包括在內,因爲它不是嚴格的真/假字段。 –

回答

1

我需要執行一個類似的任務,以下是我能弄清楚如何完成它的唯一方法。

正如其他人所提到的,WorkItem驗證是在WorkItemType的模板中定義的。字段可以根據WorkItem的當前狀態以及當前用戶的權限具有不同的驗證要求。

因此,您需要使用用戶憑證創建/檢索WorkItem實例。如果您的應用程序正在模擬當前用戶(即在使用Windows身份驗證和模擬的ASP.NET應用程序中),那麼您可以簡單地使用選項1,在那裏使用TFS API獲取WorkItem,而不模擬。

如果您的應用程序沒有模擬用戶,那麼您可以使用選項2(使用TFS模擬功能的地方)來調用用戶的行爲。這需要在應用程序的身份(即ASP.NET應用程序池的身份)中授予TFS中「允許其他人行爲請求」權限。請參閱以下鏈接瞭解更多信息: http://blogs.microsoft.co.il/blogs/shair/archive/2010/08/23/tfs-api-part-29-tfs-impersonation.aspx

下面的代碼是如何做方案1和方案的例子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

我添加了workItemId作爲示例,以便您可以看到如何獲取現有的workItem。如果您的應用程序支持編輯現有工作項目,那麼何時需要獲取現有工作項目以查看需要哪些字段。根據工作項狀態可能需要不同的字段(即,主動,解決,持有等)。如果你只是總是創建新的工作項目,那麼是的,你不需要if(workItemId.HasValue) –

相關問題