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
Créez un projet de bibliothèque de classes en l'ajoutant à une solution VSIX existante ou en créant une solution.
Dans le menu de Fichier , choisissez Nouveau, Projet.
Sous Modèles installés, développez Visual C# ou Visual Basic, puis cliquez sur dans le moyen Bibliothèque de classesde colonne.
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.
Définissez le nom et l'emplacement du projet, puis cliquez sur OK.
Créez un projet VSIX, sauf si votre solution en comporte déjà un.
Dans Explorateur de solutions, dans le menu contextuel de la solution, cliquez sur Ajouter, Nouveau projet.
Sous Modèles installés, développez Visual C# ou Visual Basic, puis sélectionnez Extensibilité.Dans la colonne centrale, choisissez Projet VSIX.
Définissez le projet VSIX comme projet de démarrage de la solution.
- Dans l'explorateur de solutions, dans le menu contextuel du projet VSIX choisissez Définir comme projet de démarrage.
Dans source.extension.vsixmanifest, sous Contenu, ajoutez un projet de bibliothèque de classes en tant que composant MEF.
Sous l'onglet de métadonnées , définissez un nom pour le package VSIX.
Sous l'onglet d' installez les cibles , définissez Visual Studio ultimate et premium comme cibles.
Sous l'onglet de Composants , choisissez Nouveau, et dans la boîte de dialogue, définissez :
Type = Composant MEF
Source = un projet dans la solution actuelle
Projet = Votre projet de Bibliothèque de classes
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.11.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 11.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
Appuyez sur F5, ou dans le menu de Débogage , choisissez 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.
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.
Créez un élément de modèle (classe UML, par exemple) et attribuez-lui un nom.
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.
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é.
Complétez le formulaire, puis enregistrez et fermez l'élément de travail.
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;
}
[!REMARQUE]
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
Référence
Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore
Concepts
Lier des éléments de modèle et des éléments de travail
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