Partager via


Comment : définir un gestionnaire de liens d'éléments de travail

Vous pouvez créer une extension d'intégration Visual Studio qui réponde lorsque l'utilisateur crée ou supprime un lien entre un élément de modèle ULM et un élément de travail. Par exemple, lorsque l'utilisateur choisit de lier un nouvel élément de travail à un élément de modèle, votre code pourrait initialiser les champs de l'élément de travail à partir de valeurs dans le modèle.

Configurer une solution d'extension UML

Cela vous permettra de développer des gestionnaires, puis de les distribuer à d'autres utilisateurs. Vous devez configurer deux projets Visual Studio :

  • un projet de bibliothèque de classes qui contient le code du gestionnaire de liens ;

  • un projet VSIX qui joue le rôle de conteneur pour l'installation de la commande. Si vous le souhaitez, vous pouvez inclure d'autres composants dans le même fichier VSIX.

Pour configurer la solution Visual Studio

  1. Créez un projet de bibliothèque de classes en l'ajoutant à une solution VSIX existante ou en créant une solution.

    1. Dans le menu Fichier, pointez sur Nouveau, puis cliquez sur Projet.

    2. Sous Modèles installés, cliquez sur Visual C# ou Visual Basic, puis dans la colonne centrale, cliquez sur Bibliothèque de classes.

    3. Définissez Solution pour indiquer si vous voulez créer une nouvelle solution ou ajouter un composant à une solution VSIX que vous avez déjà ouverte.

    4. Définissez le nom et l'emplacement du projet, puis cliquez sur OK.

  2. Créez un projet VSIX, sauf si votre solution en comporte déjà un.

    1. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur la solution, pointez sur Ajouter, puis cliquez sur Nouveau projet.

    2. Sous Modèles installés, développez Visual C# ou Visual Basic, puis cliquez sur Extensibilité. Dans la colonne centrale, cliquez sur Projet VSIX .

  3. Définissez le projet VSIX comme projet de démarrage de la solution.

    • Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le projet VSIX, puis cliquez sur Définir comme projet de démarrage.
  4. Dans source.extension.vsixmanifest, sous Contenu, ajoutez un projet de bibliothèque de classes en tant que composant MEF.

    1. Ouvrez source.extension.vsixmanifest.

    2. Cliquez sur Ajouter du contenu.

    3. Dans Sélectionner un type de contenu, sélectionnez Composant MEF.

    4. Dans Sélectionner une source, cliquez sur Projet, puis sélectionnez le nom de votre projet de bibliothèque de classes.

  5. Cliquez sur Sélectionner des éditions, puis sélectionnez les éditions de Visual Studio sur lesquelles vous voulez que votre extension s'exécute.

  6. Définissez le nom et les champs descriptifs du projet VSIX. Enregistrez le fichier.

Définition du gestionnaire de liens d'éléments de travail

Effectuez toutes les tâches suivantes dans le projet de bibliothèque de classes.

Références de projet

Ajoutez les assemblys .NET suivants à vos références de projet :

Microsoft.TeamFoundation.WorkItemTracking.Client.dll

Microsoft.VisualStudio.TeamFoundation.WorkItemTracking.dll Microsoft.VisualStudio.Modeling.Sdk.10.0

Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml

Microsoft.VisualStudio.Uml.Interfaces

System.ComponentModel.Composition

System.Drawing  : utilisé par l'exemple de code

Si vous ne trouvez pas l'une de ces références sous l'onglet .NET de la boîte de dialogue Ajouter une référence, utilisez l'onglet Parcourir pour la rechercher dans \Program Files\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\.

Importer l'espace de noms de l'élément de travail

Dans les références de votre projet Visual Studio, ajoutez des références aux assemblys suivants : 

  • Microsoft.TeamFoundation.WorkItemTracking.Client.dll

  • Microsoft.VisualStudio.TeamFoundation.WorkItemTracking.dll

Dans votre code de programme, importez les espaces de noms suivants :

using System.ComponentModel.Composition;
using Microsoft.VisualStudio.Uml.Classes;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
using Microsoft.VisualStudio.TeamFoundation.WorkItemTracking;
using System.Linq;

Définir le gestionnaire d'événements d'élément de travail lié

Ajoutez un fichier de classe au projet de bibliothèque de classes et définissez son contenu comme indiqué ci-dessous. Adaptez le nom de la classe et de l'espace de noms à vos besoins.

using System.ComponentModel.Composition;
using Microsoft.VisualStudio.Uml.Classes;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation;
using Microsoft.VisualStudio.TeamFoundation.WorkItemTracking;
using System.Linq;


namespace WorkItems
{
  [Export(typeof(ILinkedWorkItemExtension))]
  public class MyWorkItemExtension : ILinkedWorkItemExtension
  {
    // Called before a new work item is edited by the user.
    // Use this to initialize work item fields from the model element.
    public void OnWorkItemCreated(System.Collections.Generic.IEnumerable<IElement> elementsToBeLinked, IWorkItemDocument workItemDocument)
    {
      INamedElement namedElement =
            elementsToBeLinked.First() as INamedElement;
      if (namedElement != null)
        workItemDocument.Item.Title = namedElement.Name;

    }

    // Called when any work item is linked to a model element.
    public void OnWorkItemLinked(System.Collections.Generic.IEnumerable<IElement> elements, string serverUri, int workItemId)
    {
      foreach (IElement element in elements)
        foreach (IShape shape in element.Shapes())
          shape.Color = System.Drawing.Color.Red;
    }

    // Called when a work item is unlinked from a model element.
    public void OnWorkItemRemoved(IElement element, string serverUri, int workItemId)
    {
      foreach (IShape shape in element.Shapes())
        shape.Color = System.Drawing.Color.White;
    }
  }
}

Test du gestionnaire de liens

À des fins de test, exécutez votre gestionnaire de liens en mode débogage.

Pour tester le gestionnaire de liens

  1. Appuyez sur F5, ou dans le menu Déboguer, cliquez sur Démarrer le débogage.

    Une instance expérimentale de Visual Studio démarre alors.

    Dépannage : si une nouvelle instance de Visual Studio ne démarre pas, vérifiez que le projet VSIX est défini comme projet de démarrage de la solution.

  2. Dans l'instance expérimentale de Visual Studio, ouvrez ou créez un projet de modélisation, puis ouvrez ou créez un diagramme de modélisation.

  3. Créez un élément de modèle (classe UML, par exemple) et attribuez-lui un nom.

  4. Cliquez avec le bouton droit sur cet élément, puis cliquez sur Créer l'élément de travail.

    • Si l'option Ouvrir la connexion Team Foundation Server figure dans le sous-menu, cliquez dessus et suivez les instructions indiquées dans les boîtes de dialogue pour établir une connexion avec un serveur. Puis recliquez avec le bouton droit sur l'élément de modèle et cliquez sur Créer l'élément de travail.

    • Si une liste de types d'éléments de travail figure dans le sous-menu, cliquez sur l'un d'entre eux.

      Un nouveau formulaire d'élément de travail s'ouvre.

  5. Vérifiez que le titre de l'élément de travail est le même que celui de l'élément de modèle si vous avez utilisé l'exemple de code donné dans la section précédente. Cela prouve que OnWorkItemCreated() a fonctionné.

  6. Complétez le formulaire, puis enregistrez et fermez l'élément de travail.

  7. Vérifiez que l'élément de travail est maintenant de couleur rouge. Cela met en évidence OnWorkItemLinked() dans l'exemple de code.

    Dépannage : si les méthodes du gestionnaire n'ont pas été exécutées, vérifiez que :

    • le projet de bibliothèque de classes est répertorié en tant que composant MEF dans la liste Contenu de source.extensions.manifest dans le projet VSIX ;

    • l'attribut Export approprié est associé à la classe de gestionnaire et que la classe implémente ILinkedWorkItemExtension ;

    • les paramètres de tous les attributs Import et Export sont valides.

À propos du code du gestionnaire d'éléments de travail

Écoute de nouveaux éléments de travail

OnWorkItemCreated est appelé lorsque l'utilisateur choisit de créer un nouvel élément de travail à lier aux éléments de modèle. Votre code peut initialiser les champs d'éléments de travail. L'élément de travail est ensuite présenté à l'utilisateur, qui peut mettre à jour les champs et enregistrer l'élément de travail. Le lien vers un élément de modèle n'est pas créé tant que l'élément de travail n'a pas été enregistré avec succès.

  public void OnWorkItemCreated(
      IEnumerable<IElement> elementsToBeLinked,
      IWorkItemDocument workItem)
  {
    INamedElement namedElement = 
           elementsToBeLinked.First() as INamedElement;
    if (namedElement != null)
        workItem.Item.Title = namedElement.Name;
  }

Écoute de la création de lien

OnWorkItemLinked est appelé juste après qu'un lien a été créé. Il est appelé si le lien est en direction d'un nouvel élément de travail ou d'un élément existant. Il est appelé une fois pour chaque élément de travail.

public void OnWorkItemLinked
        (IEnumerable<IElement> elements, 
         string serverUri, // TFS server
         int workItemId)
{
  foreach (IElement element in elements)
    foreach (IShape shape in element.Shapes())
         shape.Color = System.Drawing.Color.Red;
}

Notes

Pour que cet exemple fonctionne, vous devez ajouter une référence de projet à System.Drawing.dll et importer l'espace de noms Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation. Toutefois, ces ajouts ne sont pas obligatoires pour d'autres implémentations d'OnWorkItemLinked.

Écoute de la suppression de lien

OnWorkItemRemoved est appelé une fois juste avant chaque lien d'élément de travail supprimé. Si un élément de modèle est supprimé, tous ses liens seront supprimés.

public void OnWorkItemRemoved
         (IElement element, string serverUri, int workItemId)
{...}

Mise à jour d'un élément de travail

À l'aide des espaces de noms Team Foundation, vous pouvez manipuler un élément de travail.

Pour utiliser l'exemple suivant, ajoutez ces assemblys .NET aux références de votre projet :

  • Microsoft.TeamFoundation.Client.dll

  • Microsoft.TeamFoundation.WorkItemTracking.Client.dll

using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.WorkItemTracking.Client;
...
public void OnWorkItemLinked
        (IEnumerable<IElement> elements, 
         string serverUri, // TFS server
         int workItemId)
{
  TfsTeamProjectCollection tfs =
        TfsTeamProjectCollectionFactory
            .GetTeamProjectCollection(new Uri(serverUri));
  WorkItemStore workItemStore = new WorkItemStore(tfs);
  WorkItem item = workItemStore.GetWorkItem(workItemId);
  item.Open();
  item.Title = "something";
  item.Save();
} 

Accès aux liens de la référence d'élément de travail

Vous pouvez accéder aux liens comme suit :

//Get:
string linkString = element.GetReference(ReferenceConstants.WorkItem);
// Set:
element.AddReference(ReferenceConstants.WorkItem, linkString, true);

Le format de linkString est :

string.Format(@"%{0}\{1}#{1}${2}", tfServer, projectCollection, RepositoryGuid, workItem.Id);

où :

  • L'URI de votre serveur serait :

    http://tfServer:8080/tfs/projectCollection

    La casse est importante dans projectCollection.

  • RepositoryGuid peut être obtenu à partir de votre connexion TFS :

    TfsTeamProjectCollection tpc = TfsTeamProjectCollectionFactory...;
    RepositoryGuid= tpc.InstanceId;
    

Pour plus d'informations sur les références, consultez Comment : attacher des chaînes de référence à des éléments de modèle.

Voir aussi

Tâches

Comment : lier des éléments de travail à des éléments de modèle

Référence

Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore

Autres ressources

Comment : attacher des chaînes de référence à des éléments de modèle

Comment : définir et installer une extension de modélisation

Programmation à l'aide de l'API UML