Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo argomento illustra i concetti di base nella definizione e nell'uso di un linguaggio specifico del dominio creato con Modeling SDK per Visual Studio.
Annotazioni
Text Template Transformation SDK e Visual Studio Modeling SDK vengono installati automaticamente quando si installano funzionalità specifiche di Visual Studio. Per altri dettagli, vedere questo post di blog.
Se non si ha esperienza con le licenze DSL, è consigliabile usare il lab degli strumenti DSL, disponibile in questo sito: Visualizzazione e modellazione di SDK
Cosa è possibile fare con un linguaggio Domain-Specific?
Un linguaggio specifico del dominio è una notazione, in genere grafica, progettata per essere usata per uno scopo specifico. Al contrario, i linguaggi come UML sono per utilizzo generico. In un linguaggio DSL è possibile definire i tipi di elemento del modello e le relative relazioni e come vengono presentati sullo schermo.
Dopo aver progettato un linguaggio DSL, è possibile distribuirlo come parte di un pacchetto VSIX (Visual Studio Integration Extension). Gli utenti lavorano con il linguaggio DSL in Visual Studio:
La notazione fa solo parte di un linguaggio DSL. Insieme alla notazione, il pacchetto VSIX include strumenti che gli utenti possono applicare per aiutarli a modificare e generare materiale dai propri modelli.
Una delle principali applicazioni di DSLS consiste nel generare codice di programma, file di configurazione e altri artefatti. Soprattutto nei progetti di grandi dimensioni e nelle linee di prodotto, in cui verranno create diverse varianti di un prodotto, generando molti degli aspetti variabili delle DSL può fornire un notevole aumento dell'affidabilità e una risposta molto rapida ai cambiamenti dei requisiti.
La parte restante di questa panoramica è una procedura dettagliata che introduce le operazioni di base di creazione e uso di un linguaggio specifico del dominio in Visual Studio.
Prerequisiti
Per definire un linguaggio DSL, è necessario aver installato i componenti seguenti:
| Componente | Link |
|---|---|
| Visual Studio | http://go.microsoft.com/fwlink/?LinkId=185579 |
| Visual Studio SDK | https://go.microsoft.com/fwlink/?linkid=2166172 |
| Modello SDK per Visual Studio |
Annotazioni
Il componente Trasformazione modello di testo viene installato automaticamente come parte del carico di lavoro di sviluppo di estensioni per Visual Studio. È anche possibile installarlo dalla scheda Singoli componenti del programma di installazione di Visual Studio, nella categoria SDK, librerie e framework . Installare il componente Modeling SDK dalla scheda Singoli componenti .
Creare una soluzione DSL
Per creare un nuovo linguaggio specifico del dominio, creare una nuova soluzione di Visual Studio usando il modello di progetto Domain-Specific Language.
Scegliere Nuovo dal menu File e quindi fare clic su Progetto.
In Tipi di progetto espandere il nodo Altri tipi di progetto e fare clic su Estendibilità.
Fare clic su Domain-Specific Language Designer.
Nella casella Nome digitare FamilyTree. Fare clic su OK.
Si apre il Domain-Specific Language Wizard e viene visualizzato un elenco di soluzioni modello DSL.
Fare clic su ogni modello per visualizzare una descrizione,
I modelli sono utili punti di partenza. Ognuno di essi fornisce un DSL funzionante completo, che è possibile modificare in base alle proprie esigenze. In genere, è consigliabile scegliere il modello più vicino a quello che si vuole creare.
Per questa procedura dettagliata, scegliere il modello Lingua minima .
Inserire un'estensione del nome del file per il linguaggio DSL nella pagina appropriata della procedura guidata. Questa è l'estensione che i file contenenti istanze del tuo DSL utilizzeranno.
Scegliere un'estensione non associata ad alcuna applicazione nel computer o in qualsiasi computer in cui si desidera installare il software DSL. Ad esempio, docx e htm sarebbero inaccettabili estensioni di file.
L'installazione guidata avvisa, se l'estensione immessa viene utilizzata come DSL. Prendere in considerazione l'uso di un'estensione di file diversa. È anche possibile reimpostare l'istanza sperimentale di Visual Studio SDK per cancellare le vecchie finestre di progettazione sperimentali. Nel menu Start di Windows digitare reimpostare Visual Studio e quindi eseguire il comando Reimposta istanza sperimentale di Microsoft Visual Studio corrispondente alla versione di Visual Studio.
Esaminare le altre pagine e quindi fare clic su Fine.
Viene generata una soluzione che contiene due progetti. Sono denominati Dsl e DslPackage. Verrà aperto un file diagramma denominato DslDefinition.dsl.
Annotazioni
La maggior parte del codice che è possibile visualizzare nelle cartelle nei due progetti viene generata da DslDefinition.dsl. Per questo motivo, la maggior parte delle modifiche al linguaggio DSL viene apportata in questo file.
L'interfaccia utente ora è simile all'immagine seguente.
Questa soluzione definisce un linguaggio specifico del dominio. Per altre informazioni, vedere Panoramica dell'interfaccia utente degli strumenti di linguaggio Domain-Specific.
Le parti importanti della soluzione DSL
Si notino gli aspetti seguenti della nuova soluzione:
Dsl\DslDefinition.dsl Si tratta del file visualizzato quando si crea una soluzione DSL. Quasi tutto il codice nella soluzione viene generato da questo file e la maggior parte delle modifiche apportate a una definizione DSL viene apportata qui. Per altre informazioni, vedere Uso del diagramma delle definizioni DSL.
Progetto Dsl Questo progetto contiene codice che definisce il linguaggio specifico del dominio.
Progetto DslPackage Questo progetto contiene codice che consente l'apertura e la modifica delle istanze del linguaggio DSL in Visual Studio.
Esecuzione del linguaggio DSL
È possibile eseguire la soluzione DSL non appena è stata creata. Successivamente, è possibile modificare gradualmente la definizione DSL, eseguendo di nuovo la soluzione dopo ogni modifica.
Per fare esperimenti con il linguaggio DSL
Fare clic su Trasforma tutti i modelli nella barra degli strumenti di Esplora soluzioni . Questa operazione rigenera la maggior parte del codice sorgente da DslDefinition.dsl.
Annotazioni
Ogni volta che si modifica DslDefinition.dsl, è necessario fare clic su Trasforma tutti i modelli prima di ricompilare la soluzione. È possibile automatizzare questo passaggio. Per altre informazioni, vedere Come automatizzare la trasformazione di tutti i modelli.
Premere F5 oppure scegliere Avvia debug dal menu Debug.
Il linguaggio DSL viene compilato e installato nell'istanza sperimentale di Visual Studio.
Viene avviata un'istanza sperimentale di Visual Studio. L'istanza sperimentale accetta le impostazioni da un sottoalbero separato del Registro di sistema, in cui le estensioni di Visual Studio vengono registrate a scopo di debug. Le normali istanze di Visual Studio non hanno accesso alle estensioni registrate in questa posizione.
Nell'istanza sperimentale di Visual Studio aprire il file del modello denominato Test da Esplora soluzioni.
o
Fare clic con il pulsante destro del mouse sul progetto debug, scegliere Aggiungi e quindi fare clic su Elemento. Nella finestra di dialogo Aggiungi elemento selezionare il tipo di file del DSL.
Il file del modello viene aperto come diagramma vuoto.
La casella degli strumenti si apre e visualizza gli strumenti appropriati per il tipo di diagramma.
Usare gli strumenti per creare forme e connettori nel diagramma.
Per creare forme, trascinare lo strumento Forma di esempio sul diagramma.
Per connettere due forme, fare clic sullo strumento Connettore di esempio, fare clic sulla prima forma e quindi fare clic sulla seconda forma.
Fare clic sulle etichette delle forme per modificarle.
La tua versione sperimentale di Visual Studio assomiglierà all'esempio seguente:
Contenuto di un modello
Il contenuto di un file che è un'istanza di un linguaggio DSL è denominato modello. Il modello contiene elementidel modello e collegamenti tra gli elementi. La definizione DSL specifica quali tipi di elementi del modello e collegamenti possono esistere nel modello. Ad esempio, in un linguaggio DSL creato dal modello Linguaggio minimo è presente un tipo di elemento del modello e un tipo di collegamento.
La definizione DSL può specificare la modalità di visualizzazione del modello in un diagramma. È possibile scegliere tra diversi stili di forme e connettori. È possibile specificare che alcune forme vengano visualizzate all'interno di altre forme.
È possibile visualizzare un modello come albero nella visualizzazione Explorer durante la modifica di un modello. Quando si aggiungono forme al diagramma, gli elementi del modello vengono visualizzati anche nello strumento di esplorazione. Lo strumento di esplorazione può essere usato anche se non è presente alcun diagramma.
Se non riesci a visualizzare l'Explorer nell'istanza di debug di Visual Studio, nel menu
l'API del tuo DSL
Il tuo DSL genera un'API che consente di leggere e aggiornare i modelli che sono istanze del DSL. Un'applicazione dell'API consiste nel generare file di testo da un modello. Per altre informazioni, vedere Design-Time generazione di codice tramite modelli di testo T4.
Nella soluzione debug aprire i file modello con estensione ".tt". Questi esempi illustrano come generare testo dai modelli e consentono di testare l'API del linguaggio DSL. Uno degli esempi è scritto in Visual Basic, l'altro in Visual C#.
Sotto ciascun file modello si trova il file che genera. Espandere il file modello in Esplora soluzioni e aprire il file generato.
Il file modello contiene un breve segmento di codice che elenca tutti gli elementi nel modello.
Il file generato contiene il risultato.
Quando si modifica un file di modello, verranno visualizzate le modifiche corrispondenti nei file generati dopo la rigenerazione dei file.
Per rigenerare i file di testo dopo aver modificato il file del modello
Nell'istanza sperimentale di Visual Studio salvare il file del modello.
Assicurarsi che il parametro del nome file in ogni file con estensione tt faccia riferimento al file di modello usato per gli esperimenti. Salvare il file con estensione tt.
Fare clic su Trasforma tutti i modelli nella barra degli strumenti di Esplora soluzioni.
o
Fare clic con il pulsante destro del mouse sui modelli da rigenerare e quindi scegliere Esegui strumento personalizzato.
È possibile aggiungere un numero qualsiasi di file di modello di testo a un progetto. Ogni modello genera un file di risultati.
Annotazioni
Quando si modifica la definizione DSL, il codice del modello di testo di esempio non funzionerà, a meno che non venga aggiornato.
Per altre informazioni, vedere Generazione di codice da un linguaggio di Domain-Specific e scrittura di codice per personalizzare un linguaggio Domain-Specific.
Personalizzazione del DSL
Quando si vuole modificare la definizione DSL, chiudere l'istanza sperimentale e aggiornare la definizione nell'istanza principale di Visual Studio.
Annotazioni
Dopo aver modificato la definizione DSL, è possibile che si perdano informazioni nei modelli di test creati usando le versioni precedenti. Ad esempio, la soluzione di debug contiene un file denominato Sample, che contiene alcune forme e connettori. Dopo aver iniziato a sviluppare la definizione DSL, non saranno visibili e andranno persi quando si salva il file.
È possibile realizzare un'ampia gamma di estensioni per DSL. Gli esempi seguenti ti daranno un'impressione delle possibilità.
Dopo ogni modifica, salvare la definizione DSL, fare clic su Trasforma tutti i modelli in Esplora soluzioni e quindi premere F5 per sperimentare il linguaggio DSL modificato.
Rinominare i tipi e gli strumenti
Rinominare le classi e le relazioni di dominio esistenti. Ad esempio, a partire da una definizione DSL creata dal modello del linguaggio minimo, è possibile eseguire le operazioni di rinominazione seguenti per fare in modo che il DSL rappresenti alberi genealogici.
Per rinominare classi di dominio, relazioni e strumenti
Nel diagramma DslDefinition, rinominare ExampleModel in FamilyTreeModel, ExampleElement in Person, Targets in Parents e Sources in Children. È possibile fare clic su ogni etichetta per modificarla.
Rinominare l'elemento e gli strumenti del connettore.
Aprire la finestra Esplora DSL facendo clic sulla scheda in Esplora soluzioni. Se non è possibile visualizzarla, scegliere Altre finestre dal menu Visualizza e quindi fare clic su Esplora DSL. Dsl Explorer è visibile solo quando il diagramma di definizione DSL è la finestra attiva.
Aprire la finestra delle Proprietà e posizionarla in modo che sia possibile visualizzare contemporaneamente DSL Explorer e Proprietà.
In Esplora DSL, espandi Editor, Schede degli strumenti, <il tuo DSL> e quindi Strumenti.
Fare clic su ExampleElement. Si tratta dell'elemento della casella degli strumenti usato per creare elementi.
Nella finestra Proprietà modificare la proprietà Name in Person.
Si noti che anche la proprietà Caption viene modificata .
Nello stesso modo, modificare il nome dello strumento ExampleConnector in ParentLink. Modificare la proprietà Caption in modo che non sia una copia della proprietà Name. Ad esempio, immettere Collegamento padre.
Ricostruire il DSL.
Salvare il file di definizione DSL.
Fare clic su Trasforma tutti i modelli nella barra degli strumenti di Esplora soluzioni
Premere F5. Attendere che venga visualizzata l'istanza sperimentale di Visual Studio.
Nella soluzione debug nell'istanza sperimentale di Visual Studio aprire un file del modello di test. Trascina gli elementi dalla casella degli strumenti. Si noti che le didascalie degli strumenti e i nomi dei tipi in Dsl Explorer sono stati modificati.
Salvare il file del modello.
Aprire un file .tt e sostituire le occorrenze dei nomi di tipo e proprietà precedenti con i nuovi nomi.
Assicurarsi che il nome file specificato nel file con estensione tt specifichi il modello di test.
Salvare il file con estensione tt. Aprire il file generato per visualizzare il risultato dell'esecuzione del codice nel file con estensione tt. Verificare che sia corretto.
Aggiungere proprietà di dominio alle classi
Aggiungere proprietà a una classe di dominio, ad esempio per rappresentare gli anni di nascita e la morte di una persona.
Per rendere visibili le nuove proprietà nel diagramma, è necessario aggiungere decoratori alla forma che visualizza l'elemento del modello. È inoltre necessario eseguire il mapping delle proprietà ai decoratori.
Per aggiungere proprietà e visualizzarle
Aggiungere le proprietà.
Nel diagramma definizione DSL fare clic con il pulsante destro del mouse sulla classe di dominio Person , scegliere Aggiungi e quindi fare clic su Proprietà dominio.
Digitare un elenco di nuovi nomi di proprietà, ad esempio Nascita e Morte. Premere INVIO dopo ognuno di essi.
Aggiungere elementi decoratori che visualizzeranno le proprietà nella forma.
Seguire la linea grigia che si estende dalla classe di dominio Person all'altro lato del diagramma. Si tratta di una mappa degli elementi del diagramma. Collega la classe di dominio a una classe di forma.
Fare clic con il pulsante destro del mouse su questa classe di forma, scegliere Aggiungi, quindi fare clic su Decorator di testo.
Aggiungere due decorator con nomi come BirthDecorator e DeathDecorator.
Selezionare ciascun nuovo decorator e, nella finestra Proprietà, impostare il campo Posizione. Determina la posizione in cui verrà visualizzato il valore della proprietà di dominio nella forma. Ad esempio, impostare InnerBottomLeft e InnerBottomRight.
Mappa i decoratori alle proprietà.
Aprire la finestra Dettagli DSL. Si trova in genere in una scheda accanto alla finestra Output. Se non è possibile visualizzarla, scegliere Altre finestre dal menu Visualizza e quindi fare clic su Dettagli DSL.
Nel diagramma delle definizioni DSL fare clic sulla riga che connette la classe di dominio Person alla classe shape.
In Dettagli DSL, nella scheda Mappe Decorator, seleziona la casella di controllo su un decorator non mappato. In Proprietà di visualizzazione selezionare la proprietà di dominio a cui eseguire il mapping. Ad esempio, mappare BirthDecorator a Birth.
Salvare il linguaggio DSL, fare clic su Trasforma tutti i modelli e premere F5.
In un diagramma di modello di esempio verificare che sia ora possibile fare clic sulle posizioni scelte e digitare i valori in essi contenuti. Inoltre, quando si seleziona una forma Persona , nella finestra Proprietà vengono visualizzate le nuove proprietà Nascita e Morte.
In un file con estensione tt è possibile aggiungere codice che ottiene le proprietà di ogni persona.
Definire nuove classi
È possibile aggiungere classi di dominio e relazioni a un modello. Ad esempio, è possibile creare una nuova classe per rappresentare le città e una nuova relazione per rappresentare che una persona viveva in una città.
Per fare in modo che i diversi tipi siano distinti in un diagramma modello, è possibile eseguire il mapping delle classi di dominio a diversi tipi di forma o a forme con geometria e colori diversi.
Per aggiungere e visualizzare una nuova classe di dominio
Aggiungere una classe di dominio e impostarla come figlio della radice del modello.
Nel diagramma di definizione DSL fare clic sullo strumento Incorpora relazione , fare clic sulla classe radice FamilyTreeModel e quindi su una parte vuota del diagramma.
Viene visualizzata una nuova classe di dominio connessa a FamilyTreeModel con una relazione di incorporamento.
Impostarne il nome, ad esempio Town.
Annotazioni
Ogni classe di dominio ad eccezione della radice del modello deve essere la destinazione di almeno una relazione di incorporamento oppure deve ereditare da una classe che è la destinazione di un incorporamento. Per questo motivo, è spesso conveniente creare una classe di dominio utilizzando lo strumento di Relazione di Embedding.
Aggiungere una proprietà di dominio alla nuova classe, ad esempio Name.
Aggiungere una relazione di riferimento tra Persona e Città.
Fare clic sullo strumento Relazione di riferimento , fare clic su Persona e quindi su Città.
Annotazioni
Le relazioni di riferimento rappresentano riferimenti incrociati da una parte dell'albero del modello a un'altra.
Aggiungere una forma per rappresentare le città nei diagrammi del modello.
Trascinare una forma Geometry dalla casella degli strumenti al diagramma e rinominarla, ad esempio TownShape.
Nella finestra Proprietà impostare i campi Aspetto della nuova forma, ad esempio Colore riempimento e Geometria.
Aggiungere un Decorator per visualizzare il nome della città e rinominarlo "NameDecorator". Impostarne la proprietà Position.
Mappare la classe di dominio Town a TownShape.
Fare clic sullo strumento Diagramma mappa elementi , quindi fare clic sulla classe di dominio Town e quindi sulla classe di forma TownShape.
Nella scheda Mappe Decorator della finestra Dettagli DSL con il connettore mappa selezionato selezionare NameDecorator e impostare Display Property (Proprietà di visualizzazione ) su Name (Nome).
Creare un connettore per visualizzare la relazione tra Person e Towns.
Trascinare un connettore dalla casella degli strumenti al diagramma. Rinominarlo e impostarne le proprietà di aspetto.
Usare lo strumento Mappa degli Elementi del Diagramma per collegare il nuovo connettore alla relazione tra Persona e Città.
Creare uno strumento per creare un nuovo comune.
In Esplora DSL, espandi Editor e quindi Schede della Casella degli Strumenti.
Fare clic con il pulsante destro del mouse su <DSL> e quindi scegliere Aggiungi Nuovo Strumento.
Impostare la proprietà Name del nuovo strumento e impostarne la proprietà Class su Town.
Impostare la proprietà Icona casella degli strumenti . Fare clic su [...] e nel campo Nome file selezionare un file icona.
Creare uno strumento connettore per creare un collegamento tra città e persone.
Fare clic con il pulsante destro del mouse sul <tuo DSL> e quindi scegliere Aggiungi un nuovo connettore.
Impostare la proprietà Name del nuovo strumento.
Nella proprietà ConnectionBuilder selezionare il generatore che contiene il nome della relazione Person-Town.
Impostare l'icona della casella degli strumenti.
Salvare la definizione DSL, fare clic su Trasforma tutti i modelli e quindi premere F5.
Nell'istanza sperimentale di Visual Studio aprire un file del modello di test. Utilizzare i nuovi strumenti per creare città e collegamenti tra città e persone. Si noti che è possibile creare collegamenti solo tra i tipi di elemento corretti.
Crea codice che elenca la città in cui vive ogni persona. I modelli di testo sono una delle posizioni in cui è possibile eseguire tale codice. Ad esempio, è possibile modificare il file di Sample.tt esistente nella soluzione debug in modo che contenga il codice seguente:
<#@ template inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation" debug="true" #> <#@ output extension=".txt" #> <#@ FamilyTree processor="FamilyTreeDirectiveProcessor" requires="fileName='Sample.ftree'" #> <# foreach (Person person in this.FamilyTreeModel.People) { #> <#= person.Name #><#if (person.Town != null) {#> of <#= person.Town.Name #> <#}#> <# foreach (Person child in person.Children) { #> <#= child.Name #> <# } } #>Quando si salva il file *.tt, verrà creato un file sussidiario che contiene l'elenco di persone e le loro residenze. Per altre informazioni, vedere Generazione di codice da un linguaggio Domain-Specific.
Convalida e comandi
È possibile sviluppare ulteriormente questo linguaggio DSL aggiungendo vincoli di convalida. Questi vincoli sono metodi che è possibile definire, che assicurano che il modello sia in uno stato corretto. Ad esempio, è possibile definire un vincolo per assicurarsi che la data di nascita di un bambino sia successiva a quella dei genitori. La funzionalità di convalida visualizza un avviso se l'utente DSL tenta di salvare un modello che interrompe uno dei vincoli. Per altre informazioni, vedere Convalida in un linguaggio di Domain-Specific.
È anche possibile definire i comandi di menu che l'utente può richiamare. I comandi possono modificare il modello. Possono anche interagire con altri modelli in Visual Studio e con risorse esterne. Per altre informazioni, vedere Procedura: Modificare un comando di menu standard.
Distribuzione del DSL
Per consentire ad altri utenti di usare il linguaggio specifico del dominio, distribuire un file di estensione di Visual Studio (VSIX). Questo viene creato quando si compila la soluzione DSL.
Individuare il file vsix nella cartella bin della soluzione. Copiarlo nel computer in cui si desidera installarlo. Nel computer fare doppio clic sul file VSIX. Il linguaggio DSL può essere usato in tutte le istanze di Visual Studio in tale computer.
È possibile usare la stessa procedura per installare il linguaggio DSL nel proprio computer in modo che non sia necessario usare l'istanza sperimentale di Visual Studio.
Per ulteriori informazioni, consultare Distribuzione di soluzioni linguistiche specifiche del dominio.
Rimozione di vecchi DSL sperimentali
Se sono stati creati DSLS sperimentali che non si desidera più, è possibile rimuoverli dal computer reimpostando l'istanza sperimentale di Visual Studio.
Questo rimuoverà dal computer tutte le DSL sperimentali e altre estensioni sperimentali di Visual Studio. Si tratta di estensioni eseguite in modalità di debug.
Questa procedura non rimuove i DSLS o altre estensioni di Visual Studio installate completamente eseguendo il file VSIX.
Per reimpostare l'istanza sperimentale di Visual Studio
Nel menu Start di Windows digitare reimpostare Visual Studio e quindi eseguire il comando Reimposta istanza sperimentale di Microsoft Visual Studio corrispondente alla versione di Visual Studio.
Ricompilare eventuali DSLS sperimentali o altre estensioni sperimentali di Visual Studio che si vogliono comunque usare.