Condividi tramite


Procedura: definire un linguaggio specifico di dominio

Per definire un linguaggio specifico di dominio (DSL), si crea una soluzione Visual Studio da un modello. La parte più importante della soluzione è il diagramma della definizione DSL, archiviato in DslDefinition.dsl. La definizione DSL definisce le classi e le forme del linguaggio DSL. Dopo la modifica e l'aggiunta a questi elementi, è possibile aggiungere il codice programma per personalizzare il linguaggio DSL in modo più dettagliato.

Se non si ha alcuna esperienza con i linguaggi DSL, è consigliabile usare DSL Tools Lab, disponibile nel sito SDK di visualizzazione e modellazione.

In questo argomento

Selezione di una soluzione per modello

Criteri per la definizione di un linguaggio DSL

Classi dell'elemento del modello

Forme nel diagramma

Riferimenti e connettori

Forme che contengono elenchi: forme raggruppamento

Porte sul limite di un'altra forma

Corsie

Tipi di proprietà

Personalizzazione del linguaggio DSL

Risoluzione dei problemi

Selezione di una soluzione per modello

Per definire un linguaggio specifico di dominio (Domain-Specific Language, DSL) devono essere installati i componenti seguenti:

Visual Studio

https://go.microsoft.com/fwlink/?LinkId=185579

Visual Studio SDK

https://go.microsoft.com/fwlink/?LinkId=185580

SDK di visualizzazione e modellazione di Visual Studio

https://go.microsoft.com/fwlink/?LinkID=186128

Per creare un nuovo linguaggio specifico di dominio, si crea una nuova soluzione Visual Studio con il modello di progetto Linguaggio specifico di dominio.

Per creare una soluzione DSL

  1. Creare una soluzione con il modello Linguaggio specifico di dominio, disponibile in Altri tipi di progetto/Extensibility nella finestra di dialogo Nuovo progetto.

    Finestra di dialogo per la creazione di una soluzione DSL

    Quando si fa clic su OK, si apre la Creazione guidata linguaggio specifico di dominio in cui è visualizzato un elenco di soluzioni DSL per il modello.

  2. Fare clic su ogni modello per visualizzare una descrizione. Scegliere la soluzione più simile a quella che si vuole creare.

    Ogni modello DSL definisce un linguaggio DSL di lavoro di base. Sarà possibile modificare questo linguaggio DSL per adattarlo ai propri requisiti.

    Per altre informazioni, fare clic su ogni esempio.

    • Selezionare Flusso attività per creare un linguaggio DSL con corsie. Le corsie sono partizioni verticali o orizzontali del diagramma.

    • Selezionare Modelli componente per creare un linguaggio DSL con porte. Le porte sono piccole forme sul bordo di una forma più grande.

    • Selezionare Diagramma classi per definire un linguaggio DSL con forme raggruppamento. Le forme raggruppamento contengono elenchi di elementi.

    • Selezionare Linguaggio minimo negli altri casi o quando non si è sicuri.

      Nota

      Per creare un diagramma classi o un diagramma componenti, prendere in considerazione l'uso dei modelli UML.Gli strumenti di modellazione UML forniscono un set di diagrammi integrati attorno a un solo modello.Sono estensibili e possono essere integrati con il linguaggio DSL con ModelBus.Per altre informazioni, vedere Sviluppo di modelli per la progettazione software.

    • Selezionare Progettazione Windows Form minimo o WPF Designer minimo per creare un linguaggio DSL visualizzato su una superficie Windows Form o WPF. Sarà necessario scrivere il codice per definire l'editor. Per altre informazioni, vedere i seguenti argomenti:

      Creating a Windows Forms-Based Domain-Specific Language

      Creating a WPF-Based Domain-Specific Language

  3. Immettere un'estensione di file per il linguaggio DSL nella pagina appropriata della procedura guidata. Questa estensione verrà usata dai file contenenti le istanze del linguaggio DSL.

    • Scegliere un'estensione di file non associata ad alcuna applicazione in questo computer o in un computer in cui si vuole installare il linguaggio DSL. Ad esempio, docx e htm sarebbero estensioni di file inaccettabili.

    • La procedura guidata avviserà se l'estensione immessa è in uso come DSL. Provare a usare un'estensione di file diversa. È anche possibile reimpostare l'istanza sperimentale di Visual Studio SDK per eliminare le precedenti finestre di progettazione sperimentali. Fare clic su Start, Tutti i programmi, Microsoft Visual Studio 2010 SDK, Strumenti e quindi Reimposta l'istanza sperimentale di Microsoft Visual Studio 2010.

  4. È possibile modificare le impostazioni nelle altre pagine o lasciare i valori predefiniti.

  5. Scegliere Fine.

    La procedura guidata crea una soluzione contenente due o tre progetti e genera il codice dalla definizione DSL.

L'interfaccia utente ora è simile a quella nell'immagine seguente.

Progettazione DSL

Questa soluzione definisce un linguaggio specifico di dominio. Per altre informazioni, vedere Overview of the Domain-Specific Language Tools User Interface.

Testare la soluzione

La soluzione per il modello offre un linguaggio DSL di lavoro, che è possibile modificare o usare così com'è.

Per testare la soluzione, premere F5 o CTRL+F5. Una nuova istanza di Visual Studio si apre in modalità sperimentale.

Nella nuova istanza di Visual Studio, in Esplora soluzioni aprire il file di esempio. Si apre un diagramma, con una casella degli strumenti.

Se si esegue una soluzione creata dal modello Linguaggio minimo, Visual Studio sperimentale sarà simile all'esempio seguente:

DSL_min

Sperimentare con gli strumenti. Creare elementi e connetterli.

Chiudere l'istanza sperimentale di Visual Studio.

Nota

Dopo aver modificato il linguaggio DSL, non sarà più possibile visualizzare le forme nel file di test di esempio.Sarà tuttavia possibile creare nuovi elementi.

Modifica del linguaggio DSL del modello

Rinominare e mantenere alcune o tutte le classi di dominio e le classi di forma nella definizione DSL del modello. I nuovi nomi delle classi devono essere nomi CLR validi, senza spazi o segni di punteggiatura.

È utile mantenere queste classi in particolare:

  • La classe radice appare in alto a sinistra nel diagramma di definizione DSL, sotto Classi e relazioni. Rinominarla con un nome diverso dal linguaggio DSL. Ad esempio, un linguaggio DSL denominato MusicLibrary potrebbe avere una classe radice denominata Music.

  • La classe diagramma appare in basso a destra nel diagramma di definizione DSL, nella colonna Elementi diagramma. Per visualizzarla, potrebbe essere necessario scorrere verso destra. In genere è denominata DslUtenteDiagram.

  • Se è stato usato il modello Flusso attività e si vuole creare diagrammi con corsie, mantenere e rinominare la classe di dominio Actor e la forma ActorSwimlane.

Eliminare o rinominare le altre classi in base ai propri requisiti.

Criteri per la definizione di un linguaggio DSL

È consigliabile sviluppare un linguaggio DSL aggiungendo o modificando una o due funzionalità per volta. Aggiungere una funzionalità, eseguire il linguaggio DSL e testarlo e quindi aggiungere ancora una o due funzionalità. Una funzionalità tipica del linguaggio DSL potrebbe essere:

  • Una classe di dominio, la relazione di incorporamento che connette l'elemento al modello, la forma necessaria per visualizzare gli elementi della classe nel diagramma e lo strumento elemento che consente agli utenti di creare elementi.

  • Le proprietà del dominio di una classe di dominio e gli elementi Decorator che le visualizzano in una forma.

  • Una relazione di riferimento e il connettere che la visualizza nel diagramma e lo strumento connettore che consente agli utenti di creare collegamenti.

  • Una personalizzazione che richiede il codice programma, ad esempio un vincolo di convalida o un comando di menu.

Le sezioni seguenti descrivono come costruire i tipi più utili di funzionalità DSL. Un linguaggio DSL può essere costruito con molti altri criteri, ma questi sono quelli usati più di frequente.

Nota

Dopo aver aggiunto una funzionalità, non dimenticare di fare clic su Trasforma tutti i modelli sulla barra degli strumenti di Esplora soluzioni prima di compilare ed eseguire il linguaggio DSL.

La figura seguente mostra la parte relativa a classi e relazioni del linguaggio DSL usato come esempio in questo argomento.

Relazioni di incorporamento e riferimento

La figura successiva è un modello di esempio di questo DSL:

Modello di istanza generato di DSL

Nota

"Modello" si riferisce a un'istanza del linguaggio DSL creata dagli utenti e in genere viene visualizzato come diagramma.Questo argomento descrive sia il diagramma di definizione DSL che i diagrammi del modello visualizzati quando viene usato il linguaggio DSL.

Definizione di classi di dominio

Le classi di dominio rappresentano i concetti del linguaggio DSL. Le istanze sono elementi del modello. In un linguaggio DSL MusicLibrary, ad esempio, è possibile avere classi di dominio denominate Album e Brano.

Per creare una classe di dominio, è possibile trascinare dallo strumento Classe di dominio denominata al diagramma e quindi rinominare la classe.

Per altre informazioni, vedere Properties of Domain Classes.

Creare una relazione di incorporamento per ogni classe di dominio

Ogni classe di dominio, tranne la classe radice, deve essere la destinazione di almeno una relazione di incorporamento o ereditare da una classe che sia la destinazione di una relazione di incorporamento.

In un modello, ogni elemento del modello è un nodo in un singolo albero di relazioni di incorporamento. L'origine e la destinazione di una relazione di incorporamento sono spesso definite come padre e figlio.

La selezione di un padre per una classe di dominio dipende da come si vuole far dipendere la durata degli elementi da altri elementi. Se un nodo di un albero viene eliminato, in genere viene eliminato anche il sottoalbero. Le classi indipendenti dell'elemento vengono quindi incorporate direttamente sotto la classe radice.

In genere, se si visualizza un elemento in un altro elemento, si vuole indicare una relazione con il proprietario. In questo caso, la classe padre più appropriata è la classe del contenitore. Si verifica un'eccezione quando l'elemento visualizzato in un contenitore è effettivamente solo un collegamento di riferimento a un elemento indipendente. In questo caso, eliminando il contenitore si elimina il riferimento, ma non la destinazione.

Nei criteri della definizione DSL descritti in questo argomento, si suppone che gli elementi visualizzati in un contenitore verranno eliminati quando verrà eliminato il contenitore. È possibile implementare schemi più complessi definendo le regole.

Come viene visualizzato l'elemento

Classe padre (di incorporamento)

Esempio nel modello di soluzione DSL

Forma in un diagramma.

Corsia.

Classe radice di DSL.

Linguaggio minimo.

Flusso attività: classe Actor.

Forma in una corsia.

Classe di dominio di elementi visualizzati come corsie.

Flusso attività: classe Task.

Elemento in un elenco in una forma, dove l'elemento viene eliminato se viene eliminato il contenitore.

Porta sul bordo di una forma.

Classe di dominio mappata alla forma contenitore.

Diagramma classi: classe Attribute.

Diagramma componenti: classe Port.

Elemento in un elenco, non eliminato se viene eliminato il contenitore.

Classe radice di DSL.

L'elenco visualizza i collegamenti di riferimento.

Non visualizzato direttamente.

La classe di cui costituisce una parte.

Nell'esempio della raccolta musicale, gli album sono visualizzati come rettangoli in cui sono elencati i titoli dei brani. Il padre di Album quindi è la classe radice Musica e il padre di Brano è Album.

Per creare una classe di dominio e contemporaneamente l'incorporamento, fare clic sullo strumento Relazione di incorporamento, quindi sulla classe padre e infine su una parte vuota del diagramma.

In genere non è necessario modificare il nome della relazione di incorporamento e dei ruoli perché terranno traccia automaticamente dei nomi delle classi.

Per altre informazioni, vedere Properties of Domain Relationships e Properties of Domain Roles.

Nota

L'incorporamento è diverso dall'ereditarietà.I figli in una relazione di incorporamento non ereditano le funzionalità dai padri.

Aggiungere le proprietà di dominio a ogni classe di dominio

Nelle proprietà di dominio vengono archiviati i valori. Esempi: Nome, Titolo, Data di pubblicazione.

Fare clic su Proprietà dominio nella classe, premere INVIO e quindi digitare il nome di una proprietà. Il tipo predefinito di una proprietà di dominio è String. Per cambiare il tipo, selezionare la proprietà di dominio e impostare il Tipo nella finestra Proprietà. Se il tipo desiderato non è nell'elenco a discesa, vedere Aggiunta di tipi di proprietà.

Impostare una proprietà Nome elemento. Selezionare una proprietà di dominio che possa essere usata per identificare gli elementi nella finestra di esplorazione linguaggio. Ad esempio, nella classe di dominio Brano è possibile selezionare la proprietà di dominio Titolo. Nella Finestra Proprietà impostare È Nome elemento su true.

Creare classi di dominio derivate

Per fare in modo che una classe di dominio abbia varianti che ne ereditano le proprietà e le relazioni, creare classi derivanti da essa. Ad esempio, Album potrebbe avere le classi derivate WMA e MP3.

Creare la classe derivata con lo strumento Classe di dominio.

Fare clic sullo strumento Ereditarietà, sulla classe derivata e quindi sulla classe di base.

Considerare la possibilità di impostare il Modificatore ereditarietà della classe di base su Abstract. Se si prevede che potrebbero essere necessarie istanze della classe di base, considerare invece la possibilità di creare una classe derivata separata.

Le classi derivate ereditano le proprietà e i ruoli delle classi di base.

Ordinare il diagramma di definizione DSL

Quando si aggiungono le relazioni, alcune classi appariranno in più posti. Per ridurre il numero di visualizzazioni e ingrandire il diagramma, fare clic con il pulsante destro del mouse sulla classe di destinazione di una relazione e quindi scegliere Sposta albero qui. Per ottenere l'effetto contrario, fare clic con il pulsante destro del mouse sulla classe di destinazione di una relazione e scegliere Dividi albero. Se questi comandi di menu non sono visibili, assicurarsi che sia selezionata solo la classe di dominio.

Usare CTRL+freccia SU e CTRL+freccia GIÙ per spostare le classi di dominio e le classi di forma.

Testare le classi di dominio

Per testare le nuove classi di dominio

  1. Fare clic su Trasforma tutti i modelli sulla barra degli strumenti di Esplora soluzioni per generare il codice di progettazione DSL. È possibile automatizzare questo passaggio. Per altre informazioni, vedere Procedura: automatizzare la trasformazione di tutti i modelli.

  2. Compilare ed eseguire il linguaggio DSL. Premere F5 o CTRL+F5 per eseguire una nuova istanza di Visual Studio in modalità sperimentale. Nell'istanza sperimentale di Visual Studio aprire o creare un file con l'estensione di file del linguaggio DSL.

  3. Aprire la finestra di esplorazione. Di fianco al diagramma c'è la finestra di esplorazione linguaggio, denominata in genere Esplora LinguaggioUtente. Se questa finestra non è visibile, potrebbe essere in una scheda sotto Esplora soluzioni. Se non si riesce a trovarla, nel menu Visualizza fare clic su Altre finestre e quindi su Esplora Linguaggio utente.

    La finestra di esplorazione contiene una visualizzazione struttura ad albero del modello.

  4. Creare nuovi elementi. Fare clic con il pulsante destro del mouse sul nodo radice nella parte superiore e quindi scegliere Aggiungi ClasseUtente.

    Una nuova istanza della classe appare nella finestra di esplorazione linguaggio.

  5. Quando si creano nuove istanze, verificare che ogni istanza abbia un nome diverso. I nomi saranno diversi solo se il flag È Nome elemento è stato impostato su una proprietà di dominio.

  6. Esaminare le proprietà di dominio. Con un'istanza della classe selezionata, controllare la Finestra Proprietà. Deve mostrare le proprietà di dominio definite in questa classe di dominio.

  7. Salvare il file, chiuderlo e riaprirlo. Tutte le istanze create devono essere visibili nella finestra di esplorazione, dopo aver espanso i nodi.

Definizione di forme nel diagramma

È possibile definire classi di elementi visualizzati in un diagramma come rettangoli, ellissi o icone.

Per definire una classe di elementi visualizzati come forme in un diagramma

  1. Definire e testare una classe di dominio come descritto in Definizione di classi di dominio**.**

    • Il padre della classe deve essere la classe radice, ovvero deve esserci una relazione di incorporamento tra la classe radice e la nuova classe di dominio.

    • Se il diagramma ha le corsie, il padre può essere la classe di dominio mappata a una corsia. Prima di continuare con questa procedura, vedere Definizione di un linguaggio DSL con corsie.

  2. Aggiungere una classe forma per rappresentare gli elementi nel diagramma modello. Trascinare da uno degli strumenti seguenti al diagramma di definizione DSL:

    • La forma geometrica implementa un rettangolo o un'ellisse.

    • La forma immagine visualizza un'immagine specificata.

    • La forma raggruppamento è un rettangolo contenente uno o più elenchi di elementi.

    Rinominare le classi forma, che appariranno sul lato destro del diagramma di definizione DSL, sotto le forme e i connettori.

  3. Definire un'immagine, se è stata creata una forma immagine.

    1. Creare un file di immagine di qualsiasi dimensione. Sono supportati i formati BMP, JPEG, GIF ed EMF.

    2. In Esplora soluzioni aggiungere il file alla soluzione in Dsl\Resources.

    3. Tornare al diagramma di definizione DSL e selezionare la nuova classe di forma dell'immagine.

    4. Nella finestra Proprietà fare clic sulla proprietà Image.

    5. Nella finestra di dialogo Seleziona immagine fare clic sul menu a discesa in Nome file e selezionare l'immagine.

  4. Aggiungere alla forma gli elementi Decorator per il testo, per visualizzare le proprietà di dominio.

    Per visualizzare il nome o il titolo dell'elemento modello, sarà probabilmente necessario almeno un elemento Decorator per il testo.

    Fare clic con il pulsante destro del mouse sull'intestazione della classe di forma, scegliere Aggiungi e quindi fare clic su Elemento Decorator testo. Impostare il nome dell'elemento Decorator e nella finestra Proprietà impostarne la Posizione.

  5. Connettere ogni forma con una mappa degli elementi del diagramma alla classe di dominio da visualizzare.

    Fare clic sullo strumento Mappa elementi diagramma, quindi sulla classe di dominio e infine sulla classe di forma.

  6. Mappare le proprietà agli elementi Decorator per il testo.

    1. Selezionare la linea grigia tra la classe di dominio e la classe di forma che rappresenta la mappa degli elementi del diagramma.

    2. Nella finestra Dettagli DSL fare clic sulla scheda Mappe elementi Decorator. Se la finestra Dettagli DSL non è visibile, nel menu Visualizza fare clic su Altre finestre e quindi su Dettagli DSL. Spesso è necessario alzare la parte superiore di questa finestra per visualizzarne tutto il contenuto.

    3. Selezionare il nome di un elemento Decorator. In Proprietà di visualizzazione selezionare il nome di una proprietà della classe di dominio. Ripetere questa operazione per ogni elemento Decorator.

      Per visualizzare una proprietà di un elemento correlato, fare clic sullo strumento di selezione albero a discesa in Percorso proprietà di visualizzazione.

    4. Verificare che accanto al nome di ogni elemento Decorator appaia un segno di spunta.

    Finestra Dettagli DSL e Mapping forme

  7. Creare un elemento della casella degli strumenti per la creazione di elementi della classe di dominio.

    1. In Esplora DSL espandere il nodo Editor e tutti i sottonodi.

    2. Fare clic con il pulsante destro del mouse sul nodo in Schede casella degli strumenti con lo stesso nome del linguaggio DSL, ad esempio MusicLibrary. Fare clic su Aggiungi strumento elemento.

      Nota

      Se si fa clic con il pulsante destro del mouse sul nodo Strumenti, Aggiungi strumento elemento non sarà visibile.Invece, fare clic sul nodo sopra.

    3. Nella finestra Proprietà con il nuovo strumento elemento selezionato impostare Classe sulla classe di dominio aggiunta di recente.

    4. Impostare Didascalia e Descrizione comando.

    5. Impostare Icona casella degli strumenti su un'icona che apparirà nella casella degli strumenti. È possibile impostarla su una nuova icona o su un'icona già usata per un altro strumento.

      Per creare una nuova icona, aprire Dsl\Resources in Esplora soluzioni. Copiare e incollare uno dei file BMP esistenti dello strumento elemento. Rinominare la copia incollata e quindi fare doppio clic per modificarla.

      Tornare al diagramma di definizione DSL, selezionare lo strumento e nella finestra Proprietà fare clic su [...] in Icona casella degli strumenti. Nella finestra di dialogo Seleziona bitmap selezionare il file con estensione BMP nel menu a discesa.

Per altre informazioni, vedere Properties of Geometry Shapes e Properties of Image Shapes.

Per testare le forme

  1. Fare clic su Trasforma tutti i modelli sulla barra degli strumenti di Esplora soluzioni per generare il codice di progettazione DSL.

  2. Compilare ed eseguire il linguaggio DSL. Premere F5 o CTRL+F5 per eseguire una nuova istanza di Visual Studio in modalità sperimentale. Nell'istanza sperimentale di Visual Studio aprire o creare un file con l'estensione di file del linguaggio DSL.

  3. Verificare che gli strumenti elemento appaiano nella casella degli strumenti.

  4. Creare le forme trascinando da uno strumento al diagramma modello.

  5. Verificare che ogni elemento Decorator per il testo venga visualizzato e che:

    1. È possibile modificarlo, a meno che il flag È di sola lettura nell'interfaccia utente non sia stato impostato sulla proprietà di dominio.

    2. Quando si modifica la proprietà nella finestra Proprietà o nell'elemento Decorator, l'altra visualizzazione viene aggiornata.

Dopo aver testato una forma, potrebbe essere necessario modificarne alcune proprietà e aggiungere alcune funzionalità avanzate. Per altre informazioni, vedere Customizing and Extending a Domain-Specific Language.

Definizione di relazioni di riferimento

È possibile definire una relazione di riferimento tra qualsiasi classe di dominio di origine e qualsiasi classe di dominio di destinazione. Le relazioni di riferimento in genere vengono visualizzate in un diagramma come connettori, ovvero come linee che uniscono le forme.

Ad esempio, se gli album musicali e gli artisti vengono visualizzati come forme nel diagramma, è possibile definire una relazione denominata ArtistiApparsiNegliAlbum che collega gli artisti agli album a cui hanno lavorato. Vedere l'esempio riportato nella figura.

Modello di istanza generato di DSL

Le relazioni di riferimento possono anche collegare elementi dello stesso tipo. Ad esempio, in un linguaggio DSL che rappresenta un albero genealogico, la relazione tra i genitori e i figli è una relazione di riferimento tra due persone.

Definire una relazione di riferimento

Fare clic sullo strumento Relazione di riferimento, quindi sulla classe di dominio di origine della relazione e infine sulla classe di dominio di destinazione. La classe di destinazione può coincidere con la classe di origine.

Ogni relazione ha due ruoli, rappresentati dalla linea su ogni lato della casella della relazione. È possibile selezionare ogni ruolo e impostarne le proprietà nella finestra Proprietà.

Considerare la possibilità di rinominare i ruoli. In una relazione tra due persone, ad esempio, potrebbe essere necessario sostituire i nomi predefiniti con Genitori e Figli, Manager e Subordinati, Insegnante e Studente e così via.

Modificare le molteplicità di ogni ruolo, se necessario. Se si vuole che ogni persona abbia almeno un manager, impostare la molteplicità visualizzata sotto l'etichetta Manager nel diagramma su 0..1.

Aggiungere le proprietà di dominio alla relazione. Nella figura, la relazione artista-album ha una proprietà di ruolo.

Impostare la proprietà Consente i duplicati della relazione, se può esistere più di un collegamento della stessa classe tra la stessa coppia di elementi modello. Ad esempio, è possibile consentire a un insegnante di insegnare più di una materia allo stesso studente.

Mappe di forme per connettori

Per altre informazioni, vedere Properties of Domain Relationships e Properties of Domain Roles.

Definire un connettore per visualizzare la relazione

Un connettore visualizza una linea tra due forme nel diagramma modello.

Trascinare lo strumento Connettore nel diagramma di definizione DSL.

Per visualizzare le etichette sul connettore, aggiungere gli elementi Decorator per il testo. Impostarne le posizioni. Per consentire a un utente di spostare un elemento Decorator per il testo, impostarne la proprietà È spostabile.

Usare lo strumento Mappa elementi diagramma per collegare il connettore alla relazione di riferimento.

Con la mappa elementi diagramma selezionata, aprire la finestra Dettagli DSL e aprire la scheda Mappe elementi Decorator.

Selezionare ogni Elemento Decorator e impostare Proprietà di visualizzazione sulla proprietà di dominio corretta.

Verificare che appaia un segno di spunta accanto a ogni elemento nell'elenco Elementi Decorator.

Definire uno strumento Generatore di connessioni

Nella finestra Esplora DSL espandere il nodo Editor e tutti i sottonodi.

Fare clic con il pulsante destro del mouse sul nodo con lo stesso nome del linguaggio DSL e quindi scegliere Aggiungi nuovo strumento di connessione.

Mentre il nuovo strumento è selezionato, nella finestra Proprietà:

  • Impostare Didascalia e Descrizione comando.

  • Fare clic su Generatore di connessioni e selezionare il generatore appropriato per la nuova relazione.

  • Impostare Icona casella degli strumenti sull'icona che si vuole visualizzare nella casella degli strumenti. È possibile impostarla su una nuova icona o su un'icona già usata per un altro strumento.

    Per creare una nuova icona, aprire Dsl\Resources in Esplora soluzioni. Copiare e incollare uno dei file BMP esistenti dello strumento elemento. Rinominare la copia incollata e quindi fare doppio clic per modificarla.

    Tornare al diagramma di definizione DSL, selezionare lo strumento e nella finestra Proprietà fare clic su [...] in Icona casella degli strumenti. Nella finestra di dialogo Seleziona bitmap selezionare il file con estensione BMP nel menu a discesa.

Per testare una relazione di riferimento e un connettore

  1. Fare clic su Trasforma tutti i modelli sulla barra degli strumenti di Esplora soluzioni per generare il codice di progettazione DSL.

  2. Compilare ed eseguire il linguaggio DSL. Premere F5 o CTRL+F5 per eseguire una nuova istanza di Visual Studio in modalità sperimentale. Nell'istanza sperimentale di Visual Studio aprire o creare un file con l'estensione di file del linguaggio DSL.

  3. Verificare che lo strumento di connessione appaia nella casella degli strumenti.

  4. Creare le forme trascinando da uno strumento al diagramma modello.

  5. Creare le connessioni tra le forme. Fare clic sullo strumento connettore, quindi su una forma e infine su un'altra forma.

  6. Verificare che non sia possibile creare connessioni tra classi inappropriate. Se, ad esempio, la relazione è tra gli album e gli artisti, verificare che non sia possibile collegare gli artisti tra loro.

  7. Verificare che le molteplicità siano corrette. Ad esempio, verificare che non sia possibile collegare una persona a più di un manager.

  8. Verificare che ogni elemento Decorator per il testo venga visualizzato e che:

    1. È possibile modificarlo, a meno che il flag È di sola lettura nell'interfaccia utente non sia stato impostato sulla proprietà di dominio.

    2. Quando si modifica la proprietà nella finestra Proprietà o nell'elemento Decorator, l'altra visualizzazione viene aggiornata.

Dopo aver testato un connettore, potrebbe essere necessario modificarne alcune proprietà e aggiungere alcune funzionalità avanzate. Per altre informazioni, vedere Customizing and Extending a Domain-Specific Language.

Definizione di forme che contengono elenchi: forme raggruppamento

Una forma raggruppamento contiene uno o più elenchi di elementi. Ad esempio, in un linguaggio DSL di una raccolta musicale, è possibile usare forme raggruppamento per rappresentare gli album musicali. In ogni album c'è un elenco di brani.

Forma Raggruppamento

Il metodo più semplice per ottenere questo effetto in una definizione DSL è definire una classe di dominio per il contenitore e una classe di dominio per ogni elenco. La classe contenitore è mappata alla forma raggruppamento.

Mappa di forme

Per altre informazioni, vedere Properties of Compartment Shapes.

Per definire una forma raggruppamento

  1. Creare la classe di dominio per il contenitore. Fare clic sullo strumento Relazione di incorporamento, quindi sulla classe radice del modello e infine su una parte vuota del diagramma di definizione DSL. Verrà creata la classe di dominio denominata Album nella figura di esempio.

    In alternativa, invece di incorporare il contenitore nella classe radice, è possibile incorporarlo in una classe di dominio mappata a una corsia.

    Aggiungere una proprietà di dominio, ad esempio Nome, alla classe e impostarne il flag È Nome elemento nella finestra Proprietà.

  2. Creare la classe di dominio degli elementi elenco. Fare clic sullo strumento Relazione di incorporamento, quindi sulla classe contenitore (Album) e infine su una parte vuota del diagramma. Verrà creata la classe di dominio denominata Brano nella figura di esempio.

    Aggiungere una proprietà di dominio, ad esempio Titolo, alla classe e impostarne il flag È Nome elemento.

    Aggiungere altre proprietà di dominio.

    Aggiungere un'altra classe di dominio di elementi elenco per ogni elenco da visualizzare.

  3. Per combinare diversi tipi di elemento nell'elenco, creare classi che ereditano dalla classe di elenco. Impostare la classe di elenco come astratta impostando Modificatore ereditarietà.

    Ad esempio, per ordinare la musica classica per compositore invece che per artista, è possibile creare due sottoclassi di Brano, BranoClassico e BranoNonClassico.

  4. Creare la forma raggruppamento. Trascinare dallo strumento Forma Raggruppamento al diagramma di definizione DSL.

    Aggiungere un elemento Decorator per il testo e impostarne il nome.

    Aggiungere un raggruppamento e impostarne il nome.

  5. Per consentire all'utente di nascondere i raggruppamenti di elenchi, fare clic con il pulsante destro del mouse sulla classe di forma raggruppamento, scegliere Aggiungi e quindi fare clic su Espandi/Comprimi elemento Decorator. Nella finestra Proprietà impostare la posizione dell'elemento Decorator.

  6. Fare clic sullo strumento Mappa elementi diagramma, quindi sulla classe di dominio contenitore e infine sulla forma raggruppamento.

  7. Selezionare il link della la mappa degli elementi del diagramma tra la classe di dominio e la forma. Nella finestra Dettagli DSL:

    1. Fare clic sulla scheda Elementi Decorator. Fare clic sul nome dell'elemento Decorator e quindi selezionare l'elemento appropriato in Proprietà di visualizzazione. Verificare che appaia un segno di spunta accanto al nome dell'elemento Decorator.

    2. Fare clic sulla scheda Mappe raggruppamento.

      Fare clic sul nome del raggruppamento.

      In Percorso raccolta elementi visualizzati passare alla classe degli elementi dell'elenco (Brano). Fare clic sulla freccia a discesa per usare lo strumento di selezione.

      In Proprietà di visualizzazione selezionare la proprietà da visualizzare nell'elenco. Nell'esempio, si tratta di Titolo.

Nota

Usando i campi di percorso nella mappa elementi Decorator e i campi della mappa raggruppamento, è possibile stabilire relazioni più complesse tra le classi di dominio e la forma raggruppamento.

Per definire uno strumento per la creazione della forma

  1. Creare un elemento della casella degli strumenti per la creazione di elementi della classe di dominio.

  2. In Esplora DSL espandere il nodo Editor e tutti i sottonodi.

  3. Fare clic con il pulsante destro del mouse sul nodo in Schede casella degli strumenti con lo stesso nome del linguaggio DSL, ad esempio MusicLibrary. Fare clic su Aggiungi strumento elemento.

    Nota

    Se si fa clic con il pulsante destro del mouse sul nodo Strumenti, Aggiungi strumento elemento non sarà visibile.Invece, fare clic sul nodo sopra.

  4. Nella finestra Proprietà con il nuovo strumento elemento selezionato impostare Classe sulla classe di dominio aggiunta di recente.

  5. Impostare Didascalia e Descrizione comando.

  6. Impostare Icona casella degli strumenti su un'icona che apparirà nella casella degli strumenti. È possibile impostarla su una nuova icona o su un'icona già usata per un altro strumento.

    Per creare una nuova icona, aprire Dsl\Resources in Esplora soluzioni. Copiare e incollare uno dei file BMP esistenti dello strumento elemento. Rinominare la copia incollata e quindi fare doppio clic per modificarla.

    Tornare al diagramma di definizione DSL, selezionare lo strumento e nella finestra Proprietà fare clic su [...] in Icona casella degli strumenti. Nella finestra di dialogo Seleziona bitmap selezionare il file con estensione BMP nel menu a discesa.

Per testare una forma raggruppamento

  1. Fare clic su Trasforma tutti i modelli sulla barra degli strumenti di Esplora soluzioni per generare il codice di progettazione DSL.

  2. Compilare ed eseguire il linguaggio DSL. Premere F5 o CTRL+F5 per eseguire una nuova istanza di Visual Studio in modalità sperimentale. Nell'istanza sperimentale di Visual Studio aprire o creare un file con l'estensione di file del linguaggio DSL.

  3. Verificare che lo strumento appaia nella casella degli strumenti.

  4. Trascinare lo strumento nel diagramma modello. Verrà creata una forma.

    Verificare che il nome dell'elemento venga visualizzato e impostato automaticamente su un valore predefinito.

  5. Fare clic con il pulsante destro del mouse sull'intestazione della nuova forma e quindi scegliere Aggiungi Elemento elenco utente. Nell'esempio, il comando è Aggiungi Brano.

    Verificare che nell'elenco appaia un elemento con un nuovo nome.

  6. Fare clic su uno degli elementi elenco e quindi esaminare la finestra Proprietà. Verranno visualizzate le proprietà degli elementi elenco.

  7. Aprire la finestra di esplorazione linguaggio. Verificare che siano visibili i nodi dei contenitori con all'interno i nodi degli elementi elenco.

Finestra di esplorazione generata di DSL

Dopo aver testato una forma raggruppamento, potrebbe essere necessario modificarne alcune delle proprietà e aggiungere alcune funzionalità avanzate. Per altre informazioni, vedere Customizing and Extending a Domain-Specific Language.

Visualizzazione di un collegamento di riferimento in un raggruppamento

Un elemento visualizzato in un raggruppamento è in genere figlio dell'elemento rappresentato dalla forma raggruppamento. A volte però potrebbe essere necessario visualizzare un elemento collegato a esso con una relazione di riferimento.

Ad esempio, è possibile aggiungere un secondo raggruppamento ad AlbumShape che visualizza un elenco degli artisti collegati all'album.

In questo caso, il raggruppamento deve visualizzare il collegamento, invece dell'elemento referenziato, perché, quando l'utente seleziona l'elemento nel raggruppamento e preme CANC, deve essere eliminato il collegamento, non l'elemento referenziato.

Tuttavia, è possibile visualizzare il nome dell'elemento referenziato nel raggruppamento.

La procedura seguente presuppone che siano già state create la classe di dominio, la relazione di riferimento, la forma raggruppamento e la mappa degli elementi del diagramma, come descritto in precedenza in questa sezione.

Per visualizzare un collegamento di riferimento in un raggruppamento

  1. Aggiungere un raggruppamento alla forma raggruppamento. Nel diagramma di definizione DSL fare clic con il pulsante destro del mouse sulla classe della forma raggruppamento, scegliere Aggiungi e quindi fare clic su Raggruppamento.

  2. Impostare Percorso raccolta elementi visualizzati per poter passare al collegamento, invece che all'elemento di destinazione. Fare clic sul menu a discesa e usare la visualizzazione struttura ad albero per selezionare la relazione di riferimento invece della destinazione. Nell'esempio, la relazione è ArtistaApparsoNegliAlbum.

  3. Impostare Percorso proprietà di visualizzazione per poter passare dal collegamento all'elemento di destinazione. Nell'esempio, si tratta di Artista.

  4. Impostare Proprietà di visualizzazione sulla proprietà appropriata dell'elemento di destinazione, ad esempio Nome.

  5. Trasformare tutti i modelli, compilare ed eseguire il linguaggio DSL e aprire un modello di test.

  6. Nel diagramma modello creare le classi appropriate della forma, impostare i nomi e creare un collegamento tra di esse. Nella forma raggruppamento verranno visualizzati i nomi degli elementi collegati.

  7. Selezionare il collegamento o l'elemento nella forma raggruppamento. Verranno rimossi sia il collegamento che l'elemento.

Definizione di porte sul limite di un'altra forma

Una porta è una forma che si trova sul limite di un'altra forma.

Le porte possono essere usate anche per fornire un punto di connessione fisso su un'altra forma, verso cui l'utente può tracciare i connettori. In questo caso, è possibile rendere trasparente la forma della porta.

Per vedere un esempio in cui si usano le porte, selezionare il modello Diagramma componente quando si crea una nuova soluzione DSL. Questo esempio mostra i punti principali che è possibile considerare quando si definiscono le porte:

  • C'è una classe di dominio che rappresenta il contenitore delle porte, Component.

  • C'è una classe di dominio che rappresenta le porte. Nell'esempio, si tratta di ComponentPort.

  • C'è una relazione di incorporamento dalla classe di dominio del contenitore alla classe di dominio delle porte. Per altre informazioni, vedere Definizione di classi di dominio.

  • Per combinare tipi diversi di porta nello stesso contenitore, è possibile creare sottoclassi della classe di dominio delle porte. Nell'esempio, InPort e OutPort ereditano da ComponentPort.

  • La classe di dominio del contenitore può essere mappata a qualsiasi tipo di forma. Nell'esempio, si tratta di ComponentShape. Per altre informazioni, vedere Definizione di forme.

  • Le classi di dominio delle porte vengono mappate alle forme porta. È possibile mappare le classi derivate a classi di forme porta separate o mappare la classe di base a una classe di forme porta.

Sotto altri aspetti, le forme porta si comportano come descritto in Definizione di forme.

Per altre informazioni, vedere Properties of Port Shapes.

Definizione di un linguaggio DSL con corsie

Le corsie sono una partizione orizzontale o verticale di un diagramma. Ogni corsia corrisponde a un elemento modello. La definizione DSL richiede una classe di dominio per gli elementi corsia.

Il modo migliore per creare un linguaggio DSL con corsie è creare una nuova soluzione DSL e scegliere il modello di soluzione Flusso attività. Nella definizione DSL, la classe Actor è la classe di dominio mappata alla corsia. Rinominare questa e le altre classi in base alle esigenze del progetto.

Per aggiungere una classe che verrà visualizzata come forma in una corsia, creare una relazione di incorporamento tra la classe delle corsie e la nuova classe. Gli utenti potranno trascinare gli elementi da una corsia a un'altra, ma ogni elemento sarà sempre in una determinata corsia. Nel modello di soluzione Flusso attività, FlowElement è figlio della classe delle corsie.

Per aggiungere una classe che verrà visualizzata come forma indipendentemente dalle corsie, creare una relazione di incorporamento tra la classe radice e la nuova classe. Gli utenti potranno inserire queste forme in qualsiasi punto del diagramma, anche sui limiti delle corsie e all'esterno delle corsie. Nel modello di soluzione Flusso attività, Comment è figlio della classe radice.

Per altre informazioni, vedere Properties of Swimlanes.

Aggiunta di tipi di proprietà

Enumerazioni di dominio e valori letterali

Un'enumerazione di dominio è un tipo con più valori letterali.

Per aggiungere un'enumerazione di dominio, fare clic con il pulsante destro del mouse sulla radice del modello in Esplora DSL e quindi scegliere Aggiungi nuova enumerazione di dominio. L'elemento apparirà in Esplora DSL sotto il nodo Tipi di dominio. Questo elemento non appare nel diagramma.

Per aggiungere i valori letterali all'enumerazione di dominio, fare clic con il pulsante destro del mouse sull'enumerazione di dominio in Esplora DSL e quindi scegliere Aggiungi nuovo valore letterale enumerazione.

Per impostazione predefinita, una proprietà con un tipo di enumerazione può essere impostata su un solo valore dell'enumerazione per volta. Per consentire a utenti e programmatori di impostare qualsiasi combinazione di valori ("campo di bit ") impostare la proprietà IsFlags dell'enumerazione.

Tipi esterni

Quando si imposta il tipo di una proprietà di dominio, se non si trova il tipo desiderato nell'elenco a discesa Tipo, è possibile aggiungere un tipo esterno. Ad esempio, è possibile aggiungere il tipo System.Drawing.Color all'elenco.

Per aggiungere un tipo, fare clic con il pulsante destro del mouse sulla radice del modello in Esplora DSL e quindi scegliere Aggiungi nuovo tipo esterno. Nella finestra Proprietà impostare il nome su Color e lo spazio dei nomi su System.Drawing. Questo tipo appare ora in Esplora DSL sotto Tipi di dominio. È possibile sceglierlo quando si imposta il tipo di una proprietà di dominio.

Personalizzazione del linguaggio DSL

Con le tecniche descritte in questo argomento, è possibile creare rapidamente un linguaggio DSL con una notazione basata su diagramma, un formato XML leggibile e gli strumenti di base necessari per generare il codice e altri artefatti.

Ci sono due metodi per estendere la definizione DSL:

  1. Ottimizzare il linguaggio DSL usando più funzionalità della definizione DSL. È possibile, ad esempio, creare un solo strumento connettore in grado di creare più tipi di connettore ed è possibile controllare le regole in base a cui, eliminando un elemento, vengono eliminati anche gli elementi correlati. Queste tecniche vengono realizzate per lo più impostando i valori nella definizione DSL e alcune richiedono poche righe di codice programma.

    Per altre informazioni, vedere Customizing and Extending a Domain-Specific Language.

  2. Estendere gli strumenti di modellazione usando il codice programma per ottenere effetti più avanzati. È possibile, ad esempio, creare comandi di menu che possono cambiare il modello ed è possibile creare strumenti che integrano due o più linguaggi DSL. VMSDK è progettato in modo specifico per facilitare l'integrazione delle estensioni con il codice generato dalla definizione DSL. Per altre informazioni, vedere Writing Code to Customise a Domain-Specific Language.

Modifica della definizione DSL

Quando si crea un elemento in una definizione DSL, molti valori predefiniti vengono impostati automaticamente. Dopo che sono stati impostati, è possibile cambiarli. Questo semplifica lo sviluppo di un linguaggio DSL, consentendo tuttavia personalizzazioni avanzate.

Ad esempio, quando si mappa una forma a un elemento, il percorso dell'elemento padre del mapping viene impostato automaticamente in base alla relazione di incorporamento della classe di dominio. Se tuttavia in seguito si cambia la relazione di incorporamento, il percorso dell'elemento padre non viene cambiato automaticamente.

Tenere quindi presente che, quando si cambiano alcune relazioni nella definizione DSL, non è insolito che vengano segnalati errori quando si salva la definizione o quando si trasformano tutti i modelli. La maggior parte di questi errori è facile da correggere. Fare doppio clic sul report errori per vedere la posizione dell'errore.

Vedere anche How to: Change the Namespace of a Domain-Specific Language.

Risoluzione dei problemi

La tabella seguente elenca alcuni dei problemi più comuni riscontrati quando si progetta un linguaggio DSL, oltre ai suggerimenti per risolverli. Altre informazioni sono disponibili nel forum sull'estensibilità degli strumenti degli effetti grafici.

Problema

Suggerimento

Le modifiche apportate al file della definizione DSL non hanno effetto.

Fare clic su Trasforma tutti i modelli sulla barra degli strumenti sopra Esplora soluzioni e quindi ricompilare la soluzione.

Le forme mostrano il nome di un elemento Decorator invece del valore della proprietà.

Impostare il mapping dell'elemento Decorator. Nel diagramma di definizione DSL fare clic sulla mappa degli elementi del diagramma, ovvero la linea grigia tra la classe di dominio e la classe di forma.

Aprire la finestra Dettagli DSL. Se non si riesce a vederla, nel menu Visualizza fare clic su Altre finestre e quindi su Dettagli DSL.

Fare clic sulla scheda Mappe elementi Decorator. Selezionare il nome dell'elemento Decorator. Verificare che la casella accanto sia selezionata. In Proprietà di visualizzazione selezionare il nome di una proprietà di dominio.

Per altre informazioni, vedere Forme nel diagramma.

In Esplora DSL, non è possibile aggiungere un elemento a una raccolta. Ad esempio, quando si fa clic con il pulsante destro del mouse su Strumenti, nel menu manca un comando "Aggiungi strumento".

Nella finestra di esplorazione del linguaggio DSL, non è possibile aggiungere un elemento a un elenco.

Fare clic con il pulsante destro del mouse sull'elemento sopra il nodo con cui si sta provando. Quando si vuole aggiungere un elemento a un elenco, il comando Aggiungi non è nel nodo dell'elenco, ma nel proprietario.

È stata creata una classe di dominio, ma non è possibile creare le istanze nella finestra di esplorazione linguaggio.

Ogni classe di dominio, tranne quella radice, deve essere la destinazione di una relazione di incorporamento.

Nella finestra di esplorazione del linguaggio DSL, gli elementi vengono mostrati solo con i nomi di tipo.

Nella definizione DSL selezionare una proprietà di dominio della classe e nella finestra Proprietà impostare È Nome elemento su true.

Il linguaggio DSL si apre sempre nell'editor XML.

Ciò può verificarsi a causa di un errore durante la lettura del file. Tuttavia, anche dopo aver corretto l'errore, è necessario reimpostare in modo esplicito l'editor come finestra di progettazione DSL.

Fare clic con il pulsante destro del mouse sull'elemento progetto, scegliere Apri con e selezionare Finestra di progettazione (predefinita) LinguaggioUtente.

La casella degli strumenti del linguaggio DSL non viene visualizzata dopo aver cambiato i nomi degli assembly.

Esaminare e aggiornare DslPackage\GeneratedCode\Package.tt. Per altre informazioni, vedere How to: Change the Namespace of a Domain-Specific Language.

La casella degli strumenti del linguaggio DSL non viene visualizzata, anche se il nome dell'assembly non è stato cambiato.

Oppure viene visualizzata una finestra di messaggio che segnala un errore nel caricamento di un'estensione.

Reimpostare l'istanza sperimentale e ricompilare la soluzione.

  1. Nel menu Start di Windows, in Tutti i programmi espandere Visual Studio SDK, quindi Strumenti e infine fare clic su Reimposta l'istanza sperimentale di Microsoft Visual Studio.

  2. Nel menu Compila di Visual Studio fare clic su Ricompila soluzione.

Vedere anche

Attività

Creating a Windows Forms-Based Domain-Specific Language

Concetti

Getting Started with Domain-Specific Languages

Creating a WPF-Based Domain-Specific Language