У меня есть несколько ответов! Не стесняйтесь вносить свои собственные выводы.
Насколько мне известно, есть 3 основных способа получения простого списка командных проектов из TFS:
Простые тесты, которые я провел, сравнивали три метода при подсчете общего числа возвращенных проектов.
Метод 1: Служба каталогов (TFS) Только 2010)
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;
}
Метод 2: VersionControlServer
public IEnumerable<string> GetTeamProjectNamesUsingVCS()
{
TfsTeamProjectCollection tp = new TfsTeamProjectCollection(collectionUri);
foreach (var p in tp.GetService<VersionControlServer>().GetAllTeamProjects(false))
yield return p.Name;
}
Метод 3: ICommonStructureService
public IEnumerable<string> GetTeamProjectNamesUsingStructureService()
{
var structService = new TfsTeamProjectCollection(collectionUri).GetService<ICommonStructureService>();
foreach (var p in structService.ListAllProjects())
yield return p.Name;
}
Проведенные мной модульные тесты были очень простыми. Я использовал метод .Count (), чтобы убедиться, что мы повторяем все командные проекты (.Any () быстрее, поскольку он остановится после возвращения имени).
Результаты
Для TFS 2010, выполняется 3 теста 5 раз подряд:
Для TFS 2008, запуск 2 тестов (без службы каталогов) 5 раз подряд:
смещения
TfsTeamProjectCollections
; вам нужно будет перебирать их тоже. В этом тесте я использовал только одну коллекцию. TfsTeamProjectCollection
; Я переключился на использование метода TfsTeamProjectCollectionFactory.GetTeamProjectCollection ()
, и он был на самом деле медленнее при каждом запуске теста. Это может быть быстрее, если вы делаете несколько вызовов на запрос. Выводы
Как вы можете видеть, похоже, что ICommonStructureService
довольно быстро находит все командные проекты после первое исполнение . Примечание. Ранее я проводил тесты с использованием ICommonStructureService3
(впервые в API TFS 2010), и тот же код был медленнее, чем два других метода. d рекомендую VersionControlServer
сделать это.
Однако имейте в виду, что именно вы хотите делать с командными проектами. Если просто перечислить их все, что вам нужно, ICSS, вероятно, путь. Если вы хотите использовать список для навигации, вам также понадобится путь ( $ / TeamProject
) или Uri. В таком случае, VCS, вероятно, является лучшим способом, поскольку вы можете использовать свойство ServerItem
, которое содержит путь к элементу. Вы также можете обойтись без простой конкатенации строк с использованием ICSS ( "$ /" + p.Name
).
Надеюсь, что это поможет некоторым другим разработчикам API TFS.