Aggiunta di strumenti di convalida architettura personalizzati a diagrammi livelli
In Visual Studio Ultimate e Visual Studio Premium, gli utenti possono convalidare il codice sorgente in un progetto di Visual Studio in base a un modello di livello per verificarne la conformità alle dipendenze di un diagramma livello.C'è un algoritmo di convalida standard, ma è possibile definire le proprie estensioni di convalida per Visual Studio Ultimate e Visual Studio Premium.
Quando l'utente seleziona il comando Convalida architettura in un diagramma livello, viene richiamato il metodo di convalida standard, seguito dalle estensioni della convalida installate.
[!NOTA]
La convalida in un diagramma livello non corrisponde alla convalida nei diagrammi UML.In un diagramma livello, lo scopo principale è confrontare il diagramma con il codice programma di altre parti della soluzione.
È possibile comprimere l'estensione di convalida dei livelli personalizzata in un progetto VSIX (Visual Studio Integration Extension) da distribuire ad altri utenti di Visual Studio Ultimate.Il validator può essere incluso in un progetto VSIX separatamente o insieme ad altre estensioni.È opportuno scrivere il codice del validator in un progetto di Visual Studio specifico anziché insieme ad altre estensioni.
Attenzione |
---|
Dopo aver creato un progetto di convalida, copiare codice di esempio alla fine di questo argomento e impostare quello alle proprie esigenze. |
Requisiti
Visual Studio Ultimate
SDK di Visual Studio
L'sdk di visualizzazione e modellazione di Visual Studio
Definizione di un validator dei livelli in un nuovo progetto VSIX
Il metodo più rapido per la creazione di un validator consiste nell'utilizzare il modello di progetto.Tale approccio comporta l'inclusione del codice e del manifesto VSIX nello stesso progetto.
Per definire un'estensione tramite un modello di progetto
Creare un progetto in una nuova soluzione utilizzando il comando Nuovo progetto del menu File.
Nella finestra di dialogo Nuovo progetto, sotto Progetti di modello fare clic su Estensione di convalida Progettazione livelli.
In base al modello viene creato un progetto contenente un piccolo esempio.
Attenzione Per far funzionare correttamente il modello:
Chiamate di modifica a LogValidationError per rimuovere gli argomenti facoltativi errorSourceNodes e errorTargetNodes.
Se si utilizzano le proprietà personalizzate, applicare l'aggiornamento descritto in Aggiunta di proprietà personalizzate a un diagramma livelli.Inoltre, aprire Esplora architettura prima di aprire una soluzione di modello.
Modificare il codice per definire la convalida.Per ulteriori informazioni, vedere Programmazione della convalida dei livelli.
Per eseguire il test dell'estensione, vedere Debug della convalida dei livelli.
[!NOTA]
Il metodo verrà chiamato solo in specifiche circostanze e i punti di interruzione non funzioneranno in modo automatico.Per ulteriori informazioni, vedere Debug della convalida dei livelli.
Per installare l'estensione nell'istanza principale di Visual Studio o in un altro computer, individuare il file .vsix in bin\*.Copiarlo nel computer in cui si desidera installare l'estensione, quindi fare doppio clic su di esso.Per disinstallare l'estensione, utilizzare Gestione estensioni nel menu Strumenti.
Aggiunta di un validator dei livelli a un progetto VSIX distinto
Se si desidera creare un progetto VSIX contenente validator dei livelli, comandi e altre estensioni, si consiglia di creare un progetto per la definizione dell'estensione VSIX e progetti distinti per i gestori.Per informazioni su altri tipi di estensioni di modello, vedere Estensione di modelli e diagrammi UML.
Per aggiungere la convalida dei livelli a un progetto VSIX distinto
Creare un progetto Libreria di classi in una nuova soluzione di Visual Studio Ultimate o in una esistente.Nella finestra di dialogo Nuovo progetto fare clic su Visual C#, quindi su Libreria di classi.Il progetto conterrà la classe per la convalida dei livelli.
Identificare o creare un progetto VSIX nella soluzione.Un progetto VSIX contiene un file denominato source.extension.vsixmanifest.Se è necessario aggiungere un progetto VSIX, attenersi alla seguente procedura:
Nella finestra di dialogo Nuovo progetto, scegliere Visual C#, Extensibility, Progetto VSIX.
In Esplora soluzioni, scegliere dal menu di scelta rapida del progetto VSIX, Imposta come progetto di avvio.
In source.extension.vsixmanifest, in Asset, aggiungere il progetto di convalida dei livelli come componente MEF:
Scegliere Nuovo.
Nella finestra di dialogo Aggiungi nuovo asset, impostare:
Tipo = Microsoft.VisualStudio.MefComponent
Origine = Progetto nella soluzione corrente
Progetto = il progetto di convalida
È inoltre necessario aggiungerlo come convalida dei livelli:
Scegliere Nuovo.
Nella finestra di dialogo Aggiungi nuovo asset, impostare:
Tipo = Microsoft.VisualStudio.ArchitectureTools.Layer.Validator.Ciò non è una delle opzioni nell'elenco a discesa.È necessario spostarlo da tastiera.
Origine = Progetto nella soluzione corrente
Progetto = il progetto di convalida
Tornare al progetto di convalida dei livelli e aggiungere i riferimenti al progetto seguenti:
Riferimento
Operazioni consentite
Microsoft.VisualStudio.GraphModel.dll
Leggere il grafico dell'architettura.
Microsoft.VisualStudio.ArchitectureTools.Extensibility.CodeSchema.dll
Leggere il modello codeDOM associato ai livelli.
Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer.dll
Leggere il modello di livello.
Microsoft.VisualStudio.ArchitectureTools.Extensibility
Leggere e aggiornare forme e diagrammi.
System.ComponentModel.Composition
Definire il componente di convalida mediante Managed Extensibility Framework (MEF).
Microsoft.VisualStudio.Modeling.Sdk.11.0
Definire le estensioni di modello.
Copiare il codice di esempio alla fine di questo argomento nel file di classe nel progetto libreria validator per includervi il codice per la convalida.Per ulteriori informazioni, vedere Programmazione della convalida dei livelli.
Per eseguire il test dell'estensione, vedere Debug della convalida dei livelli.
[!NOTA]
Il metodo verrà chiamato solo in specifiche circostanze e i punti di interruzione non funzioneranno in modo automatico.Per ulteriori informazioni, vedere Debug della convalida dei livelli.
Per installare l'estensione VSIX nell'istanza principale di Visual Studio o in un altro computer, individuare il file .vsix nella directory bin del progetto VSIX.Copiarlo nel computer in cui si desidera installare l'estensione VSIX.In Esplora risorse fare doppio clic sul file VSIX.(Esplora file in Windows 8).
Per disinstallare l'estensione, utilizzare Gestione estensioni nel menu Strumenti.
Programmazione della convalida dei livelli
Per definire un'estensione di convalida dei livelli, è necessario definire una classe con le caratteristiche seguenti:
Il formato generico della dichiarazione è il seguente:
using System.ComponentModel.Composition; using Microsoft.VisualStudio.ArchitectureTools.Extensibility.CodeSchema; using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer; using Microsoft.VisualStudio.GraphModel; ... [Export(typeof(IValidateArchitectureExtension))] public partial class Validator1Extension : IValidateArchitectureExtension { public void ValidateArchitecture(Graph graph) { GraphSchema schema = graph.DocumentSchema; ... } }
Quando si individua un errore, è possibile segnalarlo tramite LogValidationError().
Attenzione Non utilizzare i parametri facoltativi di LogValidationError.
Quando l'utente richiama il comando di menu Convalida architettura, il sistema di runtime dei livelli analizza i livelli e i relativi elementi per generare un grafico.Il grafico è costituito da quattro parti:
I modelli di livello della soluzione di Visual Studio, rappresentati come nodi e collegamenti nel grafico.
Il codice, gli elementi di progetto e gli altri elementi definiti nella soluzione e rappresentati come nodi e collegamenti che rappresentano le dipendenze individuate dal processo di analisi.
I collegamenti dai nodi di livello ai nodi di elementi di codice.
I nodi che rappresentano errori individuati dal validator.
Una volta generato il grafico, viene chiamato il metodo di convalida standard.Al termine dell'operazione, vengono chiamati in ordine non specificato i metodi di convalida delle eventuali estensioni installate.Il grafico viene passato a ciascun metodo ValidateArchitecture, che può analizzarlo e segnalare gli eventuali errori rilevati.
[!NOTA]
Tale processo di convalida non corrisponde a quello applicato ai diagrammi UML né al processo di convalida che può essere utilizzato nei linguaggi specifici di dominio.
I metodi di convalida non devono modificare il modello di livello o il codice da convalidare.
Il modello del grafico è definito in Microsoft.VisualStudio.GraphModel.Le relative classi principali sono GraphNode e GraphLink.
Ogni classe Node e ogni classe Link dispongono di una o più categorie che specificano il tipo di elemento o di relazione che la classe rappresenta.I nodi di un tipico grafico dispongono delle categorie seguenti:
Dsl.LayerModel
Dsl.Layer
Dsl.Reference
CodeSchema_Type
CodeSchema_Namespace
CodeSchema_Type
CodeSchema_Method
CodeSchema_Field
CodeSchema_Property
I collegamenti dai livelli agli elementi nel codice dispongono della categoria "Rappresenta."
Debug della convalida dei livelli
Per eseguire il debug dell'estensione di convalida dei livelli, premere CTRL+F5.Verrà aperta un'istanza sperimentale di Visual Studio.In tale istanza, aprire o creare un modello di livello.Il modello deve essere associato a codice e deve disporre di almeno una dipendenza.
Esecuzione del test di una soluzione contenente dipendenze
La convalida viene eseguita solo in presenza delle seguenti caratteristiche:
Esiste almeno un collegamento di dipendenza nel diagramma livello.
Il modello contiene livelli associati a elementi di codice.
Quando si avvia per la prima volta un'istanza sperimentale di Visual Studio per eseguire il test dell'estensione di convalida, aprire o creare una soluzione che dispone delle caratteristiche menzionate.
Esecuzione di Pulisci soluzione prima di Convalida architettura
Quando si aggiorna il codice di convalida, utilizzare il comando Pulisci soluzione del menu Compila nella soluzione sperimentale prima di eseguire il test del comando Convalida.Tale approccio si rende necessario in quanto i risultati di convalida vengono memorizzati nella cache.Se non si è aggiornato il diagramma livello di test o il relativo codice, i metodi di convalida non verranno eseguiti.
Avvio esplicito del debugger
La convalida viene eseguita in un processo distinto.Pertanto, i relativi punti di interruzione nel metodo di convalida non verranno attivati.È necessario connettere in modo esplicito il debugger al processo quando la convalida è stata avviata.
Per connettere il debugger al processo di convalida, inserire una chiamata a System.Diagnostics.Debugger.Launch() all'inizio del metodo di convalida.Quando viene visualizzata la finestra di dialogo di debug, selezionare l'istanza principale di Visual Studio.
In alternativa, è possibile inserire una chiamata a System.Windows.Forms.MessageBox.Show().Quando la finestra di messaggio appare, andare all'istanza principale di Visual Studio e dal menu Debug cliccare Allega al processo. Selezionare il processo denominato Graphcmd.exe.
Avviare sempre l'istanza sperimentale premendo CTRL+F5 (Avvia senza eseguire debug).
Distribuzione di un'estensione di convalida
Per installare l'estensione di convalida in un computer in cui è installato Visual Studio Ultimate o Visual Studio Premium, aprire il file VSIX sul computer di destinazione.Per installarla in un computer in cui è installato Team Foundation Build, è necessario estrarre manualmente il contenuto del file VSIX in una cartella Extensions.Per ulteriori informazioni, vedere Distribuzione di un'estensione di modellazione di livello.
Codice di esempio
using System;
using System.ComponentModel.Composition;
using System.Globalization;
using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.CodeSchema;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer;
using Microsoft.VisualStudio.GraphModel;
namespace Validator3
{
[Export(typeof(IValidateArchitectureExtension))]
public partial class Validator3Extension : IValidateArchitectureExtension
{
/// <summary>
/// Validate the architecture
/// </summary>
/// <param name="graph">The graph</param>
public void ValidateArchitecture(Graph graph)
{
if (graph == null) throw new ArgumentNullException("graph");
// Uncomment the line below to debug this extension during validation
// System.Windows.Forms.MessageBox.Show("Attach 2 to GraphCmd.exe with process id " + System.Diagnostics.Process.GetCurrentProcess().Id);
// Get all layers on the diagram
foreach (GraphNode layer in graph.Nodes.GetByCategory("Dsl.Layer"))
{
System.Threading.Thread.Sleep(100);
// Get the required regex property from the layer node
string regexPattern = "^[a-zA-Z]+$"; //layer[customPropertyCategory] as string;
if (!string.IsNullOrEmpty(regexPattern))
{
Regex regEx = new Regex(regexPattern);
// Get all referenced types in this layer including those from nested layers so each
// type is validated against all containing layer constraints.
foreach (GraphNode containedType in layer.FindDescendants().Where(node => node.HasCategory("CodeSchema_Type")))
{
// Check the type name against the required regex
CodeGraphNodeIdBuilder builder = new CodeGraphNodeIdBuilder(containedType.Id, graph);
string typeName = builder.Type.Name;
if (!regEx.IsMatch(typeName))
{
// Log an error
string message = string.Format(CultureInfo.CurrentCulture, Resources.InvalidTypeNameMessage, typeName);
this.LogValidationError(graph, typeName + "TypeNameError", message, GraphErrorLevel.Error, layer);
}
}
}
}
}
}
}