У меня есть несколько ответов!Не стесняйтесь вносить свои собственные выводы.
Насколько я знаю, есть 3 основных способа получить простой список командных проектов из 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 сервер является рабочим сервером под нагрузкой (т. Е. В реальном мире).1074 *
Как видите, ICommonStructureService
довольно быстро находит все командные проекты после первого выполнения . Примечание. Я проводил более ранние тесты с использованием ICommonStructureService3
(новое в API TFS 2010), и тот же код работал медленнее, чем два других метода.
Если ключевым фактором является согласованная производительностьЯ бы порекомендовал VersionControlServer
сделать это.
Однако имейте в виду, что вы хотите делать с командными проектами.Если просто перечислить их все, что вам нужно, ICSS, вероятно, путь.Если вы хотите использовать список для навигации, вам также понадобится путь ($/TeamProject
) или Uri.В этом случае, вероятно, лучше всего использовать VCS, поскольку вы можете использовать свойство ServerItem
, которое содержит путь к элементу.Вы также можете обойтись без простой конкатенации строк с использованием ICSS ("$/" + p.Name
).
Надеюсь, это поможет некоторым другим разработчикам TFS API.