Ho delle risposte! Sentiti libero di contribuire con le tue scoperte.Qual è il metodo più veloce per recuperare i progetti del team TFS utilizzando l'API SDK di TFS?
Per quanto ne so, ci sono 3 modi principali per recuperare un semplice elenco di team Progetti da TFS:
- utilizzando il nuovo servizio di catalogo (TFS 2010)
- Utilizzando la VersionControlServer (TFS 2008/2010)
- Uso della ICommonStructureService (TFS 2008/2010)
le semplici prove ho condotto confrontato i tre metodi quando il conteggio del numero totale di progetti restituito.
Metodo 1: Service Catalog (TFS 2010 solo)
public IEnumerable<string> GetTeamProjectNamesUsingCatalog()
{
ReadOnlyCollection<CatalogNode> projectNodes = new TfsTeamProjectCollection(collectionUri).CatalogNode.QueryChildren(
new[] { CatalogResourceTypes.TeamProject },
false, CatalogQueryOptions.None);
foreach (var tp in projectNodes)
yield return tp.Resource.DisplayName;
}
Metodo 2: VersionControlServer
public IEnumerable<string> GetTeamProjectNamesUsingVCS()
{
TfsTeamProjectCollection tp = new TfsTeamProjectCollection(collectionUri);
foreach (var p in tp.GetService<VersionControlServer>().GetAllTeamProjects(false))
yield return p.Name;
}
Metodo 3: ICommonStructureService
public IEnumerable<string> GetTeamProjectNamesUsingStructureService()
{
var structService = new TfsTeamProjectCollection(collectionUri).GetService<ICommonStructureService>();
foreach (var p in structService.ListAllProjects())
yield return p.Name;
}
I test di unità che ho eseguito erano semplicissimi. Ho usato il metodo .Count() per assicurarci di aver iterato tutti i progetti del team (. Any() è più veloce poiché si fermerà dopo che il nome è stato restituito).
Risultati
Per TFS 2010, in esecuzione 3 test 5 volte di fila:
Per TFS 2008, in esecuzione 2 test (nessun servizio di catalogo) 5 volte di seguito:
pregiudizi
- Il server TFS 2010 questo è stato eseguito nei confronti era in fase di sviluppo, in modo quasi nessuno stava usando.
- Non l'ho verificato con nessun account utente con privilegi minimi; Sono un amministratore sul server.
- Sto comunicando con un server TFS all'interno della rete aziendale.
- In TFS 2010, è possibile avere più
TfsTeamProjectCollections
; dovrai ripetere anche quelli. In questo test, ho usato solo una raccolta. - Ho utilizzato il costruttore per creare lo
TfsTeamProjectCollection
; Sono passato a utilizzare il metodoTfsTeamProjectCollectionFactory.GetTeamProjectCollection()
ed è stato effettivamente più lento ogni test eseguito. Potrebbe essere più veloce se si effettuano più chiamate per richiesta. - Per TFS 2008, il server è un server di produzione sotto carico (ad esempio, mondo reale).
risultati
Come si può vedere, sembra che la ICommonStructureService
è abbastanza veloce a trovare tutto il team progetti dopo la prima esecuzione. Nota: avevo eseguito test precedenti utilizzando ICommonStructureService3
(nuovo in API TFS 2010) e lo stesso codice era più lento degli altri due metodi.
Se la prestazione costante è la chiave, penso che raccomanderei VersionControlServer
per farlo.
Tenete a mente cosa volete fare con i progetti del team, comunque. Se semplicemente elencarli è tutto ciò che serve, l'ICSS è probabilmente la strada da percorrere. Se si desidera utilizzare l'elenco per la navigazione, è necessario anche il percorso ($/TeamProject
) o Uri. In tal caso, VCS è probabilmente il modo migliore per andare, poiché è possibile utilizzare la proprietà ServerItem
, che contiene il percorso dell'elemento. Si potrebbe anche ottenere una semplice concatenazione di stringhe usando ICSS ("$/" + p.Name
).
Spero che questo aiuti alcuni altri sviluppatori di API TFS.
Sebbene l'argomento riguardi le prestazioni, si noti che 'VersionControlServer' non elenca sempre tutti i progetti di team. Questo potrebbe dipendere dal fatto che il progetto usi il controllo del codice sorgente. –