Definire un linguaggio specifico del dominio

Per definire un linguaggio specifico del dominio ( DSL), creare una soluzione di 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 esperienza con le licenze DSL, è consigliabile usare il lab degli strumenti DSL, disponibile in questo sito: Visualizzazione e modellazione di SDK

Selezione di una soluzione modello

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

  • Visual Studio
  • Carico di lavoro sviluppo di estensioni di Visual Studio (include Visual Studio SDK)
  • Modeling SDK (installarlo come singolo componente in Visual Studio)

Nota

Il componente Trasformazione modello di testo viene installato automaticamente come parte del carico di lavoro sviluppo di estensioni di Visual Studio. È anche possibile installarlo dalla scheda Singoli componenti di Programma di installazione di Visual Studio, nella categoria SDK, librerie e framework. Installare il componente Modeling SDK dalla scheda Singoli componenti .

Per creare un nuovo linguaggio specifico del dominio, creare una nuova soluzione di Visual Studio usando il modello di progetto Language specifico del dominio.

Per creare una soluzione DSL

  1. Creare un nuovo progetto di linguaggio specifico del dominio.

    Viene visualizzata la Creazione guidata lingua specifica del dominio e viene visualizzato un elenco di soluzioni DSL 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 dsl con porte. Le porte sono piccole forme sul bordo di una forma più grande.

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

    • Selezionare Lingua minima in altri casi o in caso di dubbi.

    • Selezionare Progettazione WinForm minima o Progettazione WPF minima per creare un linguaggio DSL visualizzato in un'area Windows Form o WPF. Sarà necessario scrivere il codice per definire l'editor. Per ulteriori informazioni, vedi gli argomenti seguenti:

      Creazione di un linguaggio specifico di dominio basato su Windows Form

      Creazione di un linguaggio specifico di dominio basato su WPF

  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 inaccettabili estensioni di file.

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

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

  5. Fare clic su 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.

    finestra di progettazione dsl

    Questa soluzione definisce un linguaggio specifico di dominio. Per altre informazioni, vedere Panoramica dell'interfaccia utente degli strumenti di linguaggio specifici del dominio.

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. Viene aperta una nuova istanza di Visual Studio 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 Di linguaggio minimo, Visual Studio sperimentale sarà simile all'esempio seguente:

Albero di esempio di linguaggio specifico del dominio in Visual Studio

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 viene visualizzata in alto a sinistra nel diagramma di definizione DSL, in Classi e relazioni. Rinominarla con un nome diverso dal linguaggio DSL. Ad esempio, un dsl denominato Musica Library potrebbe avere una classe radice denominata Musica.

  • La classe diagramma viene visualizzata in basso a destra del diagramma di definizione DSL, nella colonna Elementi diagramma. Per visualizzarla, potrebbe essere necessario scorrere verso destra. È in genere denominato Diagramma YourDsl.

  • Se è stato usato il modello Flusso di attività e si vogliono 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.

Modelli 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 nella 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 delle classi di dominio

Le classi di dominio rappresentano i concetti del linguaggio DSL. Le istanze sono elementi del modello. Ad esempio, in un dsl Musica Library è possibile che siano presenti classi di dominio denominate Album e Song.

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

Per altre informazioni, vedere Proprietà delle classi di dominio.

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 la relativa incorporazione contemporaneamente, fare clic sullo strumento Relazione di incorporamento , quindi sulla classe padre e quindi 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 Proprietà delle relazioni di dominio e delle proprietà dei ruoli di dominio.

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. Se si desidera modificare il tipo, selezionare la proprietà di dominio e impostare Il tipo nella finestra Proprietà . Se il tipo desiderato non è incluso nell'elenco a discesa, vedere Aggiunta di tipi di proprietà.

Impostare una proprietà Element Name. Selezionare una proprietà di dominio che può essere usata per identificare gli elementi in Esplora lingue. Ad esempio, nella classe di dominio Brano è possibile selezionare la proprietà di dominio Titolo. Nella finestra Proprietà impostare Is Element Name 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 usando lo strumento Classe di dominio.

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

Prendere in considerazione l'impostazione del modificatore di ereditarietà della classe di base su astratta. 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 apparizioni e ingrandire il diagramma, fare clic con il pulsante destro del mouse sulla classe di destinazione di una relazione e quindi scegliere Porta albero qui. Per l'effetto opposto, fare clic con il pulsante destro del mouse sulla classe di destinazione di una relazione e scegliere Split Tree .For the opposite effect, right-click the target class of a relationship and click Split Tree. 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 nella barra degli strumenti di Esplora soluzioni per generare il codice della finestra di progettazione DSL. È possibile automatizzare questo passaggio. Per altre informazioni, vedere Come 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 del nome file del linguaggio DSL.

  3. Aprire Esplora risorse. Sul lato del diagramma è presente la finestra di Esplora linguaggi, che in genere è denominata YourLanguage Explorer. Se questa finestra non è visibile, potrebbe essere in una scheda sotto Esplora soluzioni. Se non è possibile trovarlo, scegliere Altre finestre dal menu Visualizza e quindi fare clic su Esploralingua.

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

    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. Ciò si verifica solo se è stato impostato il flag Is Element Name in una proprietà di dominio.

  6. Esaminare le proprietà del dominio. Con un'istanza della classe selezionata, esaminare il 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 inDefinizione delle 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 dsl con corsie.

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

    • La forma geometry fornisce un rettangolo o un'ellisse.

    • Image Shape visualizza un'immagine specificata.

    • La forma raggruppamento è un rettangolo che contiene 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 elementi decoratori di testo alla forma per visualizzare le proprietà del 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 shape, scegliere Aggiungi e quindi fare clic su Decorator di testo. Impostare il nome dell'elemento decorator e nella Finestra Proprietà impostare la relativa posizione.

  5. Connessione ogni forma con una mappa elemento diagramma alla classe di dominio da visualizzare.

    Fare clic sullo strumento Mappa elementi diagramma, quindi fare clic sulla classe di dominio e quindi sulla classe shape.

  6. Eseguire il mapping delle proprietà agli elementi decorator di 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 Decorator Mappe. Se non viene visualizzata la finestra Dettagli DSL, scegliere Altre finestre dal menu Visualizza e quindi fare clic 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à display selezionare il nome di una proprietà della classe di dominio. Ripetere questa operazione per ogni elemento Decorator.

      Se si desidera visualizzare una proprietà di un elemento correlato, fare clic sullo strumento di spostamento ad albero a discesa in Percorso per visualizzare la proprietà .

    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 relativi nodi secondari.

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

      Nota

      Se si fa clic con il pulsante destro del mouse sul nodo Strumenti , non verrà visualizzato Aggiungi strumento elemento. 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. Imposta didascalia e descrizione comando.

    5. Impostare Icona casella degli strumenti su un'icona che verrà visualizzata 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 nel Finestra Proprietà fare clic su [...] nell'icona della casella degli strumenti. Nella finestra di dialogo Seleziona bitmap selezionare il file .BMP dal menu a discesa.

    Per altre informazioni, vedere Proprietà delle forme geometry e delle proprietà delle forme immagine.

Per testare le forme

  1. Fare clic su Trasforma tutti i modelli nella barra degli strumenti di Esplora soluzioni per generare il codice della finestra 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 del nome file del linguaggio DSL.

  3. Verificare che gli strumenti degli elementi siano visualizzati nella casella degli strumenti.

  4. Creare forme trascinando uno strumento nel diagramma del modello.

  5. Verificare che ogni elemento decorator di testo sia visualizzato e che:

    1. È possibile modificarlo, a meno che non sia stato impostato il flag Is UI Read Only nella 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 Personalizzazione ed estensione di un linguaggio specifico del dominio.

Definizione delle 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à.

Prendere in considerazione la ridenominazione dei 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 moltiplicazioni 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 proprietà di dominio alla relazione. Nella figura la relazione Artist-Album ha una proprietà di ruolo.

Impostare la proprietà Allows Duplicates della relazione, se possono esistere più collegamenti della stessa classe tra la stessa coppia di elementi del 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 Proprietà delle relazioni di dominio e delle proprietà dei ruoli di dominio.

Definire un connettore per visualizzare la relazione

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

Trascinare lo strumento Connessione or nel diagramma di definizione DSL.

Per visualizzare le etichette sul connettore, aggiungere gli elementi Decorator per il testo. Impostarne le posizioni. Per consentire all'utente di spostare un elemento decorator di testo, impostarne la proprietà Is Moveable .

Usare lo strumento Diagramma mappa elementi per collegare il connettore alla relazione di riferimento.

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

Selezionare ogni Elemento Decorator e impostare la proprietà Display sulla proprietà di dominio corretta.

Assicurarsi che accanto a ogni elemento dell'elenco Decorators venga visualizzato un segno di spunta.

Definire uno strumento Generatore di connessioni

Nella finestra Esplora DSL espandere il nodo Editor e tutti i relativi 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 ion.

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

  • Impostare la didascalia e la descrizione comando.

  • Fare clic su Connessione Builder e selezionare il generatore appropriato per la nuova relazione.

  • Impostare Icona casella degli strumenti sull'icona che si desidera 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 nel Finestra Proprietà fare clic su [...] nell'icona della casella degli strumenti. Nella finestra di dialogo Seleziona bitmap selezionare il file .BMP dal menu a discesa.

Per testare una relazione di riferimento e un connettore
  1. Fare clic su Trasforma tutti i modelli nella barra degli strumenti di Esplora soluzioni per generare il codice della finestra 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 del nome file del linguaggio DSL.

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

  4. Creare forme trascinando uno strumento nel diagramma del modello.

  5. Creare 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 non appropriate. Ad esempio, se la relazione è tra album e artisti, verificare che non sia possibile collegare artisti a artisti.

  7. Verificare che le moltiplicazioni siano corrette. Ad esempio, verificare che non sia possibile connettere una persona a più manager.

  8. Verificare che ogni elemento decorator di testo sia visualizzato e che:

    1. È possibile modificarlo, a meno che non sia stato impostato il flag Is UI Read Only nella 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 Personalizzazione ed estensione di un linguaggio specifico del dominio.

Definizione di forme che contengono elenchi: forme compartimentali

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 Proprietà delle forme raggruppamento.

Per definire una forma raggruppamento

  1. Creare la classe di dominio del contenitore. Fare clic sullo strumento Incorpora relazione , fare clic sulla classe radice del modello e quindi 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 Name alla classe, e impostarne il flag Is Element Name nella Finestra Proprietà.

  2. Creare la classe di dominio dell'elemento di elenco. Fare clic sullo strumento Incorpora relazione , fare clic sulla classe contenitore (Album) e quindi 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 Title alla classe, e impostarne il flag Is Element Name .

    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 elenco. Rendere astratta la classe list impostando il modificatore di 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 del raggruppamento. Trascinare dallo strumento Raggruppamento forma nel 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 elenco, fare clic con il pulsante destro del mouse sulla classe forma raggruppamento, scegliere Aggiungi e quindi fare clic su Espandi/Comprimi decorator. Nella finestra Proprietà impostare la posizione dell'elemento Decorator.

  6. Fare clic sullo strumento Mappa elementi diagramma, fare clic sulla classe di dominio contenitore e quindi 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 Decorators . 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 Raggruppamento Mappe.

      Fare clic sul nome del raggruppamento.

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

      In Proprietà di visualizzazione selezionare la proprietà che deve essere visualizzata 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 relativi nodi secondari.

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

    Nota

    Se si fa clic con il pulsante destro del mouse sul nodo Strumenti , non verrà visualizzato Aggiungi strumento elemento. 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. Imposta didascalia e descrizione comando.

  6. Impostare Icona casella degli strumenti su un'icona che verrà visualizzata 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 nel Finestra Proprietà fare clic su [...] nell'icona della casella degli strumenti. Nella finestra di dialogo Seleziona bitmap selezionare il file BMP dal menu a discesa.

Per testare una forma raggruppamento

  1. Fare clic su Trasforma tutti i modelli nella barra degli strumenti di Esplora soluzioni per generare il codice della finestra 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 del nome file del linguaggio DSL.

  3. Verificare che lo strumento venga visualizzato 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. Nell'esempio il comando è Add Song.

    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 Personalizzazione ed estensione di un linguaggio specifico del dominio.

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, Ciò è dovuto al fatto che quando l'utente seleziona l'elemento nel raggruppamento e preme DELETE, si desidera eliminare il collegamento, non l'elemento a cui si fa riferimento.

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.

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

  2. Impostare Percorso raccolta elementi visualizzati per passare al collegamento, anziché al relativo 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 è ArtistAppearedOnAlbums.

  3. Impostare Percorso su Proprietà di visualizzazione per spostarsi dal collegamento all'elemento di destinazione. Nell'esempio si tratta di Artist.

  4. Impostare Display Property sulla proprietà appropriata dell'elemento di destinazione, ad esempio Name.

  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 delle 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 visualizzare un esempio che usa le porte, selezionare il modello Diagramma componenti 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. in questo esempio corrisponde a ComponentPort.

  • C'è una relazione di incorporamento dalla classe di dominio del contenitore alla classe di dominio delle porte. Per altre informazioni, vedere Definizione delle 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.

    In altri termini, le forme porta si comportano come descritto in Definizione delle forme.

    Per altre informazioni, vedere Proprietà delle forme porta.

Definizione di un 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 Proprietà delle corsie.

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 verrà visualizzato in Esplora DSL nel nodo Tipi di dominio. Questo elemento non appare nel diagramma.

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

Per impostazione predefinita, una proprietà con un tipo di enumerazione può essere impostata su un solo valore dell'enumerazione per volta. Se si desidera che gli utenti e i programmatori siano in grado di impostare qualsiasi combinazione di valori, ovvero un "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 viene ora visualizzato in Esplora DSL in 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 Personalizzazione ed estensione di un linguaggio specifico del dominio.

  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 Scrittura di codice per personalizzare un linguaggio specifico del dominio.

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 Procedura: Modificare lo spazio dei nomi di un linguaggio specifico del dominio.

Risoluzione dei problemi

La tabella seguente elenca alcuni dei problemi più comuni riscontrati quando si progetta un linguaggio DSL, oltre ai suggerimenti per risolverli. Altri consigli sono disponibili nel forum sull'estendibilità degli strumenti di visualizzazione.

Problema Suggerimento
Le modifiche apportate al file della definizione DSL non hanno effetto. Fare clic su Trasforma tutti i modelli nella 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 è possibile visualizzarla, scegliere Altre finestre dal menu Visualizza e quindi fare clic su Dettagli DSL.

Fare clic sulla scheda Decorator Mappe. 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 Is Element Name 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 del progetto, scegliere Apri con e selezionare Progettazione lingua(impostazione predefinita).
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 Procedura: Modificare lo spazio dei nomi di un linguaggio specifico del dominio.
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. In Windows menu Start, in Tutti i programmi espandere Visual Studio SDK, quindi Strumenti e quindi fare clic su Reimposta l'istanza sperimentale di Microsoft Visual Studio.
2. Nel menu Compila fare clic su Ricompila soluzione.