Wie kann ich programmgesteuert feststellen, ob ein TFS-Workitem-Feld erforderlich ist?

  • Für mein Projekt muss ich programmgesteuert auf nicht verwaltete TFS-Server zugreifen und Echtzeitinformationen zu den Feldern in den WorkItemTypes abrufen. Ich kann die Feldnamen und die meisten Informationen abrufen, die ich benötige, wenn ich die FieldDefinition in der FieldDefinitions-Auflistung des WorkItemTypes anschaue.

         public WitType(WorkItemType type)
        {
            this.Fields = new List<string>();
    
            foreach (FieldDefinition f in type.FieldDefinitions)
            {
                Fields.Add(f.Name);
            }
        }
     

    Eine Sache, die fehlt, ist die IsRequired-Eigenschaft. Ich muss in der Lage sein zu erkennen, ob ein Feld erforderlich ist. Ich habe versucht, eine Workitemory-Abfrage auszuführen.

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

    und überprüft dann die IsRequired-Eigenschaft des Field-Elements in der Fields-Auflistung des WorkItem. Das einzige Problem ist, dass für einen bestimmten Arbeitselementtyp ein Arbeitselement besagt, dass Titel erforderlich ist. Das nächste Arbeitselement enthält dann IsRequired property = false.

    Gibt es eine Möglichkeit, festzustellen, ob ein WorkItem-Feld erforderlich ist, ohne auf die WIT-XML-Datei zurückzugreifen? Wenn nicht, gibt es eine Möglichkeit, programmgesteuert auf die WIT-XML-Datei zuzugreifen?

    22 November 2011
    Dave Krupa
1 answer
  • Ich musste eine ähnliche Aufgabe ausführen, und das Folgende war der einzige Weg, um herauszufinden, wie ich das erreichen kann.

    Wie von anderen erwähnt, WorkItem-Validierung ist in der Vorlage des WorkItemTypes definiert. Felder können unterschiedliche Validierungsanforderungen haben, basierend auf dem aktuellen Status des WorkItem und sogar den Berechtigungen des aktuellen Benutzers.

    Daher müssen Sie eine WorkItem-Instanz mit den Anmeldeinformationen des Benutzers erstellen / abrufen. Wenn Ihre Anwendung den aktuellen Benutzer imitiert (dh in einer ASP.NET-Anwendung mit Windows-Authentifizierung und Identitätswechsel), können Sie einfach Option 1 verwenden, bei der Sie das WorkItem mithilfe der TFS-API abrufen, ohne sich imitieren zu müssen |>

    Wenn sich der Benutzer nicht in Ihrer Anwendung imitiert, können Sie Option 2, in der Sie die TFS-Identitätswechselfunktion verwenden, verwenden, um Anrufe eines Benutzers zu tätigen. Dies erfordert das Erteilen der Berechtigung "Anforderungen für das Verhalten anderer erstellen" in TFS für die Identität der Anwendung (d. H. In ASP.NET die Identität des Anwendungspools). Weitere Informationen finden Sie unter dem folgenden Link: http://blogs.microsoft.co.il/blogs/shair/archive/2010/08/23/tfs-api-part-29-tfs-impersonation.aspx

    Der folgende Code ist ein Beispiel, wie Option 1 und Option 2 ausgeführt werden.

             // 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
                  }
               }
            }
     
    30 November 2011
    Garry English