У меня есть ответы! Не стесняйтесь вносить свои собственные выводы.
Насколько я знаю, есть 3 основных способа получить простой список Team Projects из TFS:
- Использование новой службы каталогов (TFS 2010)
- Использование VersionControlServer (TFS 2008/2010)
- Использование ICommonStructureService (TFS 2008/2010)
Простые тесты, которые я провел, сравнили три метода при подсчете общего количества возвращенных проектов.
Метод 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 раз подряд:
Искажения
- Сервер TFS 2010, с которым он работал, был в разработке, поэтому вряд ли кто-то его использовал.
- Я не тестировал это с помощью учетных записей пользователей с наименьшими привилегиями; Я администратор на сервере.
- Я общаюсь с сервером TFS в корпоративной сети.
- В TFS 2010 вы можете иметь несколько
TfsTeamProjectCollections
; вам нужно будет итерации через них. В этом тесте я использовал только одну коллекцию. - Я использовал конструктор для создания
TfsTeamProjectCollection
; Я переключился на использование методаTfsTeamProjectCollectionFactory.GetTeamProjectCollection()
, и он был фактически медленнее каждого тестового прогона. Это может быть быстрее, если вы делаете несколько вызовов на запрос. - Для TFS 2008 сервер - это производственный сервер под нагрузкой (т.е. реальный мир).
Выводы
Как вы можете видеть, кажется, что ICommonStructureService
довольно быстро находит все командные проекты после первого выполнения. Примечание. Я провел более ранние тесты, используя ICommonStructureService3
(новый в TFS 2010 API), и тот же код был медленнее, чем два других метода.
Если согласованная производительность является ключевой, я бы рекомендовал VersionControlServer
сделать это.
Имейте в виду, что вы хотите делать с командами. Если просто перечислять их все, что вам нужно, ICSS, вероятно, путь. Если вы хотите использовать список для навигации, вам также понадобится путь ($/TeamProject
) или Uri. В этом случае VCS, вероятно, лучше всего подходит, поскольку вы можете использовать свойство ServerItem
, которое содержит путь к элементу. Вы также можете избежать простой конкатенации строк с помощью ICSS ("$/" + p.Name
).
Надеемся, что это поможет другим разработчикам API TFS.