Share via


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

  1. Erstellen Sie ein Klassenbibliotheksprojekt. Sie können dieses entweder zu einer vorhandenen VSIX-Projektmappe hinzufügen, oder Sie können eine neue Projektmappe erstellen.

    1. Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt.

    2. Klicken Sie unter Installierte Vorlagen auf Visual C# oder Visual Basic, und klicken Sie anschließend in der mittleren Spalte auf Klassenbibliothek.

    3. Legen Sie Projektmappe fest, um anzugeben, ob eine neue Projektmappe erstellt oder einer bereits geöffneten VSIX-Projektmappe eine Komponente hinzugefügt werden soll.

    4. Legen Sie Name und Speicherort für das Projekt fest, und klicken Sie auf OK.

  2. Erstellen Sie ein VSIX-Projekt, sofern die Projektmappe noch kein VSIX-Projekt enthält.

    1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Projektmappe, zeigen Sie auf Hinzufügen, und klicken Sie anschließend auf Neues Projekt.

    2. Erweitern Sie unter Installierte Vorlagen den Knoten Visual C# oder Visual Basic, und klicken Sie anschließend auf Erweiterungen. Klicken Sie in der mittleren Spalte auf VSIX Project.

  3. Legen Sie das VSIX-Projekt als Startprojekt der Projektmappe fest.

    • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das VSIX-Projekt, und klicken Sie anschließend auf Als Startprojekt festlegen.
  4. Fügen Sie in source.extension.vsixmanifest unter Inhalt das Klassenbibliotheksprojekt als MEF-Komponente hinzu.

    1. Öffnen Sie source.extension.vsixmanifest.

    2. Klicken Sie auf Inhalt hinzufügen.

    3. Wählen Sie für Inhaltstyp auswählen die Option MEF-Komponente aus.

    4. Klicken Sie in Quelle auswählen auf Projekt, und wählen Sie den Namen des Klassenbibliotheksprojekts aus.

  5. Klicken Sie auf Editionen auswählen, und wählen Sie die Visual Studio-Editionen aus, unter denen die Erweiterung ausgeführt werden soll.

  6. Legen Sie den Namen und die Beschreibungsfelder des VSIX fest. Speichern Sie die Datei.

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.10.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 10.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

  1. Drücken Sie F5, oder klicken Sie im Menü Debuggen auf Debuggen starten.

    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.

  2. Öffnen oder erstellen Sie in der experimentellen Instanz von Visual Studio ein Modellierungsprojekt, und öffnen oder erstellen Sie ein Modellierungsdiagramm.

  3. Erstellen Sie ein Modellelement (z. B. eine UML-Klasse), und legen Sie dessen Namen fest.

  4. 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.

  5. 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.

  6. Füllen Sie das Formular aus. Speichern und schließen Sie anschließend die Arbeitsaufgabe.

  7. Ü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;
}

Tipp

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();
} 

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);

Hierbei ist:

  • 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

Aufgaben

Gewusst wie: Verknüpfen von Modellelementen mit Arbeitsaufgaben

Referenz

Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore

Weitere Ressourcen

Gewusst wie: Anfügen von Referenzzeichenfolgen an Modellelemente

Gewusst wie: Definieren und Installieren einer Modellierungserweiterung

Programmieren mit der UML-API