我有一些答案!随意贡献自己的发现。使用TFS SDK API检索TFS团队项目的最快方法是什么?
据我所知,有从TFS检索团队项目的简单列表3种主要方式:
- 使用新目录服务(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
)您也可以避免使用简单字符串连接。
希望这可以帮助其他TFS API开发人员。
尽管主题涉及到性能,但请注意'VersionControlServer'并不总是列出所有团队项目。这可能与该项目是否使用源代码管理有关。 – 2017-02-02 19:45:24