据我所知,有三种主要方法从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)避开简单的字符串连接。
希望这有助于其他TFS API开发人员。
看看你的统计数据,我没有看到找到最快的好处。他们都显得非常快。这可能是预编程优化吗?