У меня есть ответы! Не стесняйтесь вносить свои собственные выводы.Каков самый быстрый способ получения командных проектов TFS с использованием API TFS SDK?
Насколько я знаю, есть 3 основных способов получить простой список команды проектов с TFS:
- Использование нового сервиса Каталога (TFS 2010)
- Использование VersionControlServer (TFS 2008/2010)
- Использование ICommonStructureService (TFS 2008/2010)
Простого тесты я проводил сравнил три метода при подсчете общего количества проектов вернулся.
Метод 1: Catalog Service (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 раз подряд:
Погрешности
- ССТ 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.
Хотя тема включает в себя производительность, обратите внимание, что 'VersionControlServer' не всегда перечисляет все командные проекты. Это может иметь отношение к тому, использует ли проект контроль источника. –