Procedura: definire un gestore dei collegamenti agli elementi di lavoro
È possibile creare un progetto Visual Studio Integration Extension che risponde quando l'utente crea o elimina un collegamento tra un elemento di un modello UML e un elemento di lavoro. Ad esempio, quando l'utente sceglie di collegare un nuovo elemento di lavoro a un elemento di modello, il codice può inizializzare i campi dell'elemento di lavoro a partire dai valori del modello.
Configurare una soluzione di estensione UML
In questo modo sarà possibile sviluppare gestori e distribuirli ad altri utenti. È necessario configurare due progetti Visual Studio:
Un progetto Libreria di classi contenente il codice del gestore collegamenti.
Un progetto VSIX che funge da contenitore per l'installazione del comando. Se si desidera, è possibile includere altri componenti nello stesso progetto VSIX.
Per configurare la soluzione di Visual Studio
Creare un progetto Libreria di classi, aggiungendolo a una soluzione VSIX esistente o creando una nuova soluzione.
Scegliere Nuovo dal menu File, quindi fare clic su Progetto.
In Modelli installati fare clic su Visual Basic o Visual C#, quindi nella colonna centrale fare clic su Libreria di classi.
Impostare Soluzione per indicare se si desidera creare una nuova soluzione o aggiungere un componente a una soluzione VSIX già aperta.
Impostare nome e percorso per il progetto, quindi fare clic su OK.
Creare un progetto VSIX, a meno che la soluzione non ne contenga già uno.
In Esplora soluzioni fare clic con il pulsante destro del mouse sulla soluzione, scegliere Aggiungi, quindi Nuovo progetto.
In Modelli installati espandere Visual Basic o Visual C#, quindi fare clic su Extensibility. Nella colonna centrale fare clic su Progetto VSIX.
Impostare il progetto VSIX come progetto di avvio della soluzione.
- In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto VSIX e scegliere Imposta come progetto di avvio.
In source.extension.vsixmanifest, sotto Contenuto, aggiungere il progetto Libreria di classi come componente MEF.
Aprire source.extension.vsixmanifest
Fare clic su Aggiungi contenuto.
In Seleziona un tipo di contenuto selezionare Componente MEF.
In Selezionare un'origine fare clic su Progetto e selezionare il nome del progetto Libreria di classi.
Fare clic su Seleziona versioni e selezionare le edizioni di Visual Studio in cui si desidera eseguire l'estensione.
Impostare il nome e i campi descrittivi del progetto VSIX. Salvare il file.
Definizione del gestore collegamenti degli elementi di lavoro
Eseguire tutte le attività seguenti nel progetto Libreria di classi.
Riferimenti dei progetti
Aggiungere gli assembly .NET seguenti ai riferimenti del progetto:
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 - utilizzato dal codice di esempio
Se non è possibile trovare uno di questi riferimenti nella scheda .Net della finestra di dialogo Aggiungi riferimento, utilizzare la scheda Sfoglia per trovarlo in \Programmi\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\.
Importazione dello spazio dei nomi degli elementi di lavoro
Nei Riferimenti al progetto Visual Studio, aggiungere riferimenti agli assembly seguenti:
Microsoft.TeamFoundation.WorkItemTracking.Client.dll
Microsoft.VisualStudio.TeamFoundation.WorkItemTracking.dll
Nel codice del programma importare gli spazi dei nomi seguenti:
using System.ComponentModel.Composition;
using Microsoft.VisualStudio.Uml.Classes;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
using Microsoft.VisualStudio.TeamFoundation.WorkItemTracking;
using System.Linq;
Definizione del gestore degli eventi degli elementi di lavoro collegati
Aggiungere un file di classe al progetto Libreria di classi e impostarne il contenuto come indicato di seguito. Modificare i nomi di spazio dei nomi e classi in base alle proprie preferenze.
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 del gestore collegamenti
A scopo di test, eseguire il gestore collegamenti in modalità di debug.
Per testare il gestore collegamenti
Premere F5 oppure scegliere Avvia debug dal menu Debug.
Verrà avviata un'istanza sperimentale di Visual Studio.
Risoluzione dei problemi: se non viene avviata una nuova istanza di Visual Studio, verificare che il progetto VSIX sia impostato come progetto di avvio della soluzione.
Nell'istanza sperimentale di Visual Studio aprire o creare un progetto di modello e un diagramma di modellazione.
Creare un elemento del modello, ad esempio una classe UML, e impostarne il nome.
Fare clic con il pulsante destro del mouse sull'elemento, quindi scegliere Crea elemento di lavoro.
Se nel sottomenu viene visualizzato il comando Apri connessione a Team Foundation Server, fare clic su di esso e seguire le indicazioni nelle finestre di dialogo per connettersi a un server. Fare di nuovo clic con il pulsante destro del mouse sull'elemento del modello, quindi scegliere Crea elemento di lavoro.
Se nel sottomenu viene visualizzato un elenco di tipi di elemento di lavoro, fare clic su uno di essi.
Verrà aperto un nuovo form elemento di lavoro.
Verificare che il titolo dell'elemento di lavoro corrisponda all'elemento del modello, se è stato utilizzato il codice di esempio della sezione precedente. Ciò indica il corretto funzionamento di OnWorkItemCreated().
Completare il form, salvare e chiudere l'elemento di lavoro.
Verificare che l'elemento di lavoro sia ora colorato di rosso. Ciò illustra il funzionamento di OnWorkItemLinked() nel codice di esempio.
Risoluzione dei problemi: se i metodi del gestore eventi non vengono eseguiti, verificare gli aspetti seguenti:
Il progetto Libreria di classi è elencato come componente MEF nell'elenco Contenuto in source.extensions.manifest nel progetto VSIX.
Alla classe del gestore è collegato l'attributo Export corretto e la classe implementa ILinkedWorkItemExtension.
I parametri di tutti gli attributi Import ed Export sono validi.
Informazioni sul gestore elementi di lavoro
Rilevamento dei nuovi elementi di lavoro
L'oggetto OnWorkItemCreated viene chiamato quando l'utente sceglie di creare un nuovo elemento di lavoro da collegare agli elementi del modello. Il codice può inizializzare i campi dell'elemento di lavoro. L'elemento di lavoro viene quindi presentato all'utente che può aggiornare i campi e salvare l'elemento di lavoro. Il collegamento a un elemento di modello viene creato solo dopo il corretto salvataggio dell'elemento di lavoro.
public void OnWorkItemCreated(
IEnumerable<IElement> elementsToBeLinked,
IWorkItemDocument workItem)
{
INamedElement namedElement =
elementsToBeLinked.First() as INamedElement;
if (namedElement != null)
workItem.Item.Title = namedElement.Name;
}
Rilevamento della creazione di un collegamento
L'oggetto OnWorkItemLinked viene chiamato subito dopo la creazione di un collegamento. Viene chiamato sia se l'elemento di lavoro a cui si crea il collegamento è nuovo sia se tale elemento è già esistente. Viene chiamato una volta per ogni elemento di lavoro.
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;
}
Nota
Per far funzionare questo esempio, è necessario aggiungere un riferimento al progetto a System.Drawing.dll e importare lo spazio dei nomi Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation. Tuttavia, queste aggiunte non sono necessarie per altre implementazioni di OnWorkItemLinked.
Rilevamento della rimozione di un collegamento
OnWorkItemRemoved viene chiamato una sola volta poco prima dell'eliminazione di ogni collegamento all'elemento di lavoro. Se si elimina un elemento di modello, tutti i relativi collegamenti verranno rimossi.
public void OnWorkItemRemoved
(IElement element, string serverUri, int workItemId)
{...}
Aggiornamento di un elemento di lavoro
Utilizzando gli spazi dei nomi di Team Foundation è possibile modificare un elemento di lavoro.
Per utilizzare l'esempio seguente, aggiungere gli assembly .NET seguenti ai riferimenti del progetto:
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();
}
Accesso ai collegamenti dei riferimenti agli elementi di lavoro
È possibile accedere ai collegamenti nel modo seguente:
//Get:
string linkString = element.GetReference(ReferenceConstants.WorkItem);
// Set:
element.AddReference(ReferenceConstants.WorkItem, linkString, true);
Il formato di linkString è:
string.Format(@"%{0}\{1}#{1}${2}", tfServer, projectCollection, RepositoryGuid, workItem.Id);
dove:
L'URI del server sarà:
http://tfServer:8080/tfs/projectCollection
La combinazione di maiuscole e minuscole è importante in projectCollection.
RepositoryGuid può essere ottenuto dalla connessione TFS:
TfsTeamProjectCollection tpc = TfsTeamProjectCollectionFactory...; RepositoryGuid= tpc.InstanceId;
Per ulteriori informazioni sui riferimenti, vedere Procedura: allegare stringhe di riferimento agli elementi di modello.
Vedere anche
Attività
Procedura: collegare elementi di modello a elementi di lavoro
Riferimenti
Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore
Concetti
Altre risorse
Procedura: allegare stringhe di riferimento agli elementi di modello
Procedura: definire e installare un'estensione di modellazione