¡Tengo algunas respuestas! Siéntase libre de contribuir con sus propios hallazgos.¿Cuál es el método más rápido para recuperar proyectos del equipo TFS utilizando la API TFS SDK?
Por lo que yo sé, hay 3 formas principales para recuperar una simple lista de proyectos de equipo de TFS:
- utilizando el nuevo servicio de catálogo (TFS 2010)
- Utilizando el VersionControlServer (TFS 2008/2010)
- Uso de la ICommonStructureService (TFS 2008/2010)
los simples pruebas que realicé compararon los tres métodos al contar el número total de proyectos regresó.
Método 1: Servicio de Catálogo (TFS 2010 Solamente)
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;
}
Método 2: VersionControlServer
public IEnumerable<string> GetTeamProjectNamesUsingVCS()
{
TfsTeamProjectCollection tp = new TfsTeamProjectCollection(collectionUri);
foreach (var p in tp.GetService<VersionControlServer>().GetAllTeamProjects(false))
yield return p.Name;
}
Método 3: ICommonStructureService
public IEnumerable<string> GetTeamProjectNamesUsingStructureService()
{
var structService = new TfsTeamProjectCollection(collectionUri).GetService<ICommonStructureService>();
foreach (var p in structService.ListAllProjects())
yield return p.Name;
}
Las pruebas de unidad que ejecuté fueron súper simples. Usé el método .Count() para asegurarme de que iteramos todos los proyectos del equipo (.Any() es más rápido ya que se detendrá después de que se devuelva el primer nombre).
Resultados
Para TFS 2010, corriendo 3 pruebas 5 veces seguidas:
Para TFS 2008, corriendo 2 pruebas (sin servicio de catálogo) 5 veces seguidas:
sesgos
- El servidor de TFS 2010 esta estaba corriendo contra estaba en desarrollo, por lo que casi nadie lo estaba usando.
- No probé esto con ninguna cuenta de usuario de privilegios mínimos; Soy un administrador en el servidor.
- Me estoy comunicando con un servidor TFS dentro de la red corporativa.
- En TFS 2010, puede tener múltiples
TfsTeamProjectCollections
; necesitarás iterar a través de ellos también. En esta prueba, solo usé una colección. - Utilicé el constructor para crear el
TfsTeamProjectCollection
; Cambié a usar el métodoTfsTeamProjectCollectionFactory.GetTeamProjectCollection()
y en realidad fue más lento cada prueba. Puede ser más rápido si realiza múltiples llamadas por solicitud. - Para TFS 2008, el servidor es un servidor de producción bajo carga (es decir, en el mundo real).
hallazgos
Como se puede ver, parece que el ICommonStructureService
es bastante rápido a la búsqueda de todo el Equipo de Proyectos tras la primera ejecución. Nota: He hecho pruebas anteriores usando ICommonStructureService3
(nuevo en TFS 2010 API) y el mismo código fue más lento que los otros dos métodos.
Si el rendimiento constante es la clave, creo que recomendaría VersionControlServer
para hacerlo.
Sin embargo, tenga en cuenta qué es lo que quiere hacer con los proyectos del equipo. Si simplemente lo enumera es todo lo que necesita, el ICSS es probablemente el camino a seguir. Si desea utilizar la lista para la navegación, también necesitará la ruta ($/TeamProject
) o Uri. En ese caso, VCS es probablemente la mejor manera de hacerlo ya que puede usar la propiedad ServerItem
, que contiene la ruta al artículo. También puede salirse con la concatenación de cadenas simples usando ICSS ("$/" + p.Name
).
Espero que esto ayude a otros desarrolladores de API de TFS.
Aunque el tema implica rendimiento, tenga en cuenta que 'VersionControlServer' no siempre enumera todos los proyectos del equipo. Esto podría tener que ver con si el proyecto usa control de fuente. –