Gewusst wie: Definieren eines Linkhandlers für Arbeitsaufgaben
Sie können eine Visual Studio Integration Extension erstellen, die auf das Erstellen oder Löschen eines Links zwischen einem UML-Modellelement und einer Arbeitsaufgabe durch den Benutzer reagiert.Wenn Benutzer eine neue Arbeitsaufgabe mit einem Modellelement verknüpfen, können beispielsweise im Code die Felder der Arbeitsaufgabe aus Werten im Modell initialisiert werden.
Einrichten einer UML-Erweiterungsprojektmappe
Auf diese Weise können Sie Handler entwickeln und dann an andere Benutzer verteilen.Sie müssen zwei Visual Studio-Projekte einrichten:
Ein Klassenbibliotheksprojekt, das den Code für den Linkhandler enthält.
Ein VSIX-Projekt, das als Container zum Installieren des Befehls fungiert.Gegebenenfalls können Sie in dasselbe VSIX auch weitere Komponenten einschließen.
So richten Sie die Visual Studio-Projektmappe ein
Erstellen Sie ein Klassenbibliotheksprojekt. Sie können dieses entweder zu einer vorhandenen VSIX-Projektmappe hinzufügen, oder Sie können eine neue Projektmappe erstellen.
Zeigen Sie im Menü Datei Sie Neu, Projektaus.
Erweitern Sie unter Installierte VorlagenVisual C# oder Visual Basic, im mittleren Spalte auf Klassenbibliothek.
Legen Sie Projektmappe fest, um anzugeben, ob eine neue Projektmappe erstellt oder einer bereits geöffneten VSIX-Projektmappe eine Komponente hinzugefügt werden soll.
Legen Sie Name und Speicherort für das Projekt fest, und klicken Sie auf OK.
Erstellen Sie ein VSIX-Projekt, sofern die Projektmappe noch kein VSIX-Projekt enthält.
Klicken Sie im Kontextmenü Projektmappen-Explorerder Projektmappe, wählen Sie Hinzufügen, Neues Projektaus.
Erweitern Sie unter Installierte VorlagenVisual C# oder Visual Basic, wählen Sie Erweiterungenaus.Wählen Sie in der mittleren Spalte VSIX-Projektaus.
Legen Sie das VSIX-Projekt als Startprojekt der Projektmappe fest.
- Klicken Sie im Projektmappen-Explorer im Kontextmenü des VSIX-Projekts Als Startprojekt festlegenaus.
Fügen Sie in source.extension.vsixmanifest unter Inhalt das Klassenbibliotheksprojekt als MEF-Komponente hinzu.
Auf der Registerkarte Metadaten Legen Sie einen Namen für das VSIX fest.
Legen Sie auf der Registerkarte Ziele installieren Visual Studio Ultimate und Premium als Ziele fest.
Wählen Sie auf der Registerkarte ObjekteNeuund im Dialogfeld Satz aus:
Typ = MEF-Komponente
Quelle = Ein Projekt in der aktuellen Projektmappe
Projekt = Das Klassenbibliotheksprojekt
Definieren des Arbeitsaufgaben-Linkhandlers
Führen Sie alle folgenden Aufgaben im Klassenbibliotheksprojekt aus.
Projektverweise
Fügen Sie den Projektverweisen die folgenden .NET-Assemblys hinzu:
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 – wird vom Beispielcode verwendet
Falls Sie einen dieser Verweise nicht auf der Registerkarte .NET des Dialogfelds Verweis hinzufügen finden können, suchen Sie auf der Registerkarte "Durchsuchen" unter "\Programme\Microsoft Visual Studio 11.0\Common7\IDE\PrivateAssemblies\" nach der Assembly.
Importieren des Namespaces für Arbeitsaufgaben
Fügen Sie im Visual Studio-Projekt unter Verweise Verweise auf die folgende Assemblys hinzu:
Microsoft.TeamFoundation.WorkItemTracking.Client.dll
Microsoft.VisualStudio.TeamFoundation.WorkItemTracking.dll
Importieren Sie im Programmcode die folgenden Namespaces:
using System.ComponentModel.Composition;
using Microsoft.VisualStudio.Uml.Classes;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
using Microsoft.VisualStudio.TeamFoundation.WorkItemTracking;
using System.Linq;
Definieren des Ereignishandlers für verknüpfte Arbeitsaufgaben
Fügen Sie dem Klassenbibliotheksprojekt eine Klassendatei hinzu, und legen Sie deren Inhalt wie folgt fest.Ändern Sie die Namespace- und Klassennamen entsprechend den jeweiligen Anforderungen.
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;
}
}
}
Testen des Linkhandlers
Führen Sie den Linkhandler zu Testzwecken im Debugmodus aus.
So testen Sie den Linkhandler
Drücken Sie F5oder im Menü Debuggen Wählen Debugging startenaus.
Eine experimentelle Instanz von Visual Studio wird gestartet.
Problembehandlung: Wenn ein neues Visual Studio nicht gestartet wird, stellen Sie sicher, dass das VSIX-Projekt als Startprojekt der Projektmappe festgelegt ist.
Öffnen oder erstellen Sie in der experimentellen Instanz von Visual Studio ein Modellierungsprojekt, und öffnen oder erstellen Sie ein Modellierungsdiagramm.
Erstellen Sie ein Modellelement (z. B. eine UML-Klasse), und legen Sie dessen Namen fest.
Klicken Sie mit der rechten Maustaste auf das Element, und klicken Sie anschließend auf Arbeitsaufgabe erstellen.
Wenn im Untermenü Team Foundation Server-Verbindung öffnen angezeigt wird, klicken Sie auf diese Option, und befolgen Sie die Anweisungen in den Dialogfeldern, um eine Verbindung mit einem Server herzustellen.Klicken Sie anschließend erneut mit der rechten Maustaste auf das Modellelement, und klicken Sie auf Arbeitsaufgabe erstellen.
Wenn im Untermenü eine Liste von Arbeitsaufgabentypen angezeigt wird, klicken Sie auf einen Arbeitsaufgabentyp.
Ein neues Arbeitsaufgabenformular wird geöffnet.
Vergewissern Sie sich, dass der Titel der Arbeitsaufgabe dem des Modellelements entspricht, wenn Sie den Beispielcode aus dem vorherigen Abschnitt verwendet haben.Dadurch wird nachgewiesen, dass OnWorkItemCreated() erfolgreich ausgeführt wurde.
Füllen Sie das Formular aus. Speichern und schließen Sie anschließend die Arbeitsaufgabe.
Überprüfen Sie, ob die Arbeitsaufgabe jetzt rot gefärbt ist.Dies wird von OnWorkItemLinked() im Beispielcode veranschaulicht.
Problembehandlung: Wenn die Handlermethoden nicht ausgeführt wurden, überprüfen Sie Folgendes:
Das Klassenbibliotheksprojekt ist im VSIX-Projekt als MEF-Komponente in source.extensions.manifest in der Liste Inhalt aufgeführt.
An die Handlerklasse ist das richtige Export-Attribut angefügt, und von der Klasse wird ILinkedWorkItemExtension implementiert.
Die Parameter aller Import-Attribute und Export-Attribute sind gültig.
Informationen zum Arbeitsaufgaben-Handlercode
Lauschen auf neue Arbeitsaufgaben
OnWorkItemCreated wird aufgerufen, wenn Benutzer eine neue Arbeitsaufgabe erstellen, die mit den Modellelementen verknüpft werden soll.Die Arbeitsaufgabenfelder können im Code initialisiert werden.Anschließend wird die Arbeitsaufgabe angezeigt, und Benutzer können die Felder aktualisieren und die Arbeitsaufgabe speichern.Der Link zu einem Modellelement wird erst erstellt, wenn die Arbeitsaufgabe erfolgreich gespeichert wurde.
public void OnWorkItemCreated(
IEnumerable<IElement> elementsToBeLinked,
IWorkItemDocument workItem)
{
INamedElement namedElement =
elementsToBeLinked.First() as INamedElement;
if (namedElement != null)
workItem.Item.Title = namedElement.Name;
}
Lauschen auf Linkerstellung
OnWorkItemLinked wird unmittelbar nach dem Erstellen eines Links aufgerufen.Dabei spielt es keine Rolle, ob die Verknüpfung mit einer neuen oder einer bestehenden Arbeitsaufgabe hergestellt wurde.Der Aufruf erfolgt einmal für jede Arbeitsaufgabe.
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;
}
Hinweis |
---|
Damit dieses Beispiel funktioniert, müssen Sie einen Projektverweis auf System.Drawing.dll hinzufügen und den Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation-Namespace importieren.Diese Hinzufügungen sind für andere Implementierungen von OnWorkItemLinked jedoch nicht erforderlich. |
Lauschen auf Linkentfernung
OnWorkItemRemoved wird einmal unmittelbar vor dem Entfernen des Arbeitsaufgabenlinks aufgerufen.Wenn ein Modellelement gelöscht wird, werden alle Links entfernt.
public void OnWorkItemRemoved
(IElement element, string serverUri, int workItemId)
{...}
Aktualisieren einer Arbeitsaufgabe
Sie können Arbeitsaufgaben mithilfe der Team Foundation-Namespaces bearbeiten.
Fügen Sie den Verweisen des Projekts die folgenden .NET-Assemblys hinzu, um das folgende Beispiel zu verwenden:
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();
}
Zugreifen auf die Verweislinks für Arbeitsaufgaben
Sie können wie folgt auf die Links zugreifen:
//Get:
string linkString = element.GetReference(ReferenceConstants.WorkItem);
// Set:
element.AddReference(ReferenceConstants.WorkItem, linkString, true);
Das Format von linkString lautet wie folgt:
string.Format(@"%{0}\{1}#{1}${2}", tfServer, projectCollection, RepositoryGuid, workItem.Id);
Dabei gilt:
Der URI für den Server lautet dann:
http://tfServer:8080/tfs/projectCollection
In projectCollection wird die Groß- und Kleinschreibung beachtet.
RepositoryGuid kann von der TFS-Verbindung abgerufen werden:
TfsTeamProjectCollection tpc = TfsTeamProjectCollectionFactory...; RepositoryGuid= tpc.InstanceId;
Weitere Informationen über Verweise finden Sie unter Gewusst wie: Anfügen von Referenzzeichenfolgen an Modellelemente.
Siehe auch
Referenz
Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore
Konzepte
Verknüpfen von Modellelementen und Arbeitsaufgaben
Gewusst wie: Anfügen von Referenzzeichenfolgen an Modellelemente
Gewusst wie: Definieren und Installieren einer Modellierungserweiterung