Depuis les premières versions de TFS, il fallait utiliser les API du Team Explorer pour se connecter via .Net à TFS. Jusqu’à TFS 2013 compris, cela n’a pas changé. Cela était d’autant plus frustrant que le protocole n’était pas documenté et en SOAP: pas de possibilité d’utiliser autre chose qu’une application .Net sous Windows.

Avec TFS 2015 et Visual Studio Online tout change et c’est plus simple. Nous avons maintenant deux jeux d’API mais dont une API Rest enfin!


image

Chaque API a en fait son utilité :

  • Le premier est un client pur REST avec des API asynchrones. Il ne fonctionne qu’avec Visual Studio Online et TFS 2015
  • Le second (l’extended) permet d’utiliser l’API historique

Lequel choisir ? Il y a plusieurs possibilités :

  • vous avez déjà du code qui marche avec l’API historique alors autant rester sur le même, par contre nous n’aurez pas certaines fonctionnalités qui sont que sur le client REST
  • vous démarrez un nouveau projet, autant utiliser le nouveau jeu d’API si il est suffisant

Travailler avec ce nouveau client est complètement différent : nouvelles dlls et nouvelles classes. N’essayez même pas de compiler vos ancien code avec. On trouve des notions de paginations dans les requêtes, très utiles lorsque l’on doit travailler sur des devices légers. Il y a moins de couches entre notre code et le réseau, ce qui fait que l’empreinte mémoire est aussi plus légère.

Coté programmation, quand nous avions un point d’entrée qui était la classe TfsTeamProjectCollection dans l’API historique, ici nous avons plusieurs clients en fonction des besoins. Pour les reconnaitre, il suffit de chercher les classes qui finissent par HttpClient :

image

Voici un exemple de code qui récupère les équipes des projets d’une collection avec les deux versions de l’API, l’ancienne en premier. Avec la nouvelle version, vous remarquerez que j’utilise des 2 clients (un pour les projets et un autre pour les équipes) et des méthodes asynchrones.

static void Go()
{
    Uri _serverUri = new Uri("https://mycollectionname.visualstudio.com/DefaultCollection");
    TfsTeamProjectCollection collection = 
TfsTeamProjectCollectionFactory.GetTeamProjectCollection(_serverUri);

    // Retrieve the project URI. Needed to enumerate teams.
    var css4 = collection.GetService<ICommonStructureService4>();
    var projects = css4.ListProjects();
    TfsTeamService teamService = collection.GetService<TfsTeamService>();

    foreach (var project in projects)
    {
        Console.WriteLine($"[{project.Name}]");
        var teams = teamService.QueryTeams(project.Uri);
        foreach (var team in teams)
        {
            Console.WriteLine($"* {team.Name}");
        }
    }
}
static async Task Go()
{
    var baseUrl = new Uri("https://mycollectionname.visualstudio.com/DefaultCollection");

    var vssClientCredentials = new VssClientCredentials();

    var projectClient = new ProjectHttpClient(baseUrl,vssClientCredentials);
    var teamClient = new TeamHttpClient(baseUrl, vssClientCredentials);

    var projects = await projectClient.GetProjects();

    foreach (var project in projects)
    {
        Console.WriteLine($"[{project.Name}]");
        var teams = await teamClient.GetTeams(project.Name);

        foreach (var team in teams)
        {
            Console.WriteLine($"* {team.Name}");
        }

    }
}

Bon devs!

@+