Condividi tramite


Scrivere codice per personalizzare un linguaggio specifico del dominio

Questa sezione illustra come usare codice personalizzato per accedere, modificare o creare un modello in un linguaggio specifico del dominio ( DSL).

Contesto per la scrittura di codice per un linguaggio DSL

Esistono diversi contesti in cui è possibile scrivere codice che funziona con un linguaggio DSL:

  • Comandi personalizzati. È possibile creare un comando che gli utenti possono richiamare facendo clic con il pulsante destro del mouse sul diagramma e che possono modificare il modello. Per altre informazioni, vedere Procedura: Aggiungere un comando al menu di scelta rapida.

  • Convalida. È possibile scrivere codice che verifica che il modello sia in uno stato corretto. Per altre informazioni, vedere Convalida in un linguaggio specifico del dominio.

  • Override del comportamento predefinito. È possibile modificare molti aspetti del codice generato da DslDefinition.dsl. Per altre informazioni, vedere Override ed estensione delle classi generate.

  • Trasformazione Testo. È possibile scrivere modelli di testo che contengono codice che accede a un modello e genera un file di testo, ad esempio per generare codice programma. Per altre informazioni, vedere Generazione di codice da un linguaggio specifico del dominio.

  • Altre estensioni di Visual Studio. È possibile scrivere estensioni VSIX separate che leggono e modificano i modelli. Per altre informazioni, vedere Procedura: Aprire un modello da file nel codice del programma

Archivio in memoria

Le istanze delle classi definite in DslDefinition.dsl vengono mantenute in una struttura di dati denominata Archivio in memoria (IMS) o Store. Le classi definite in un linguaggio DSL accettano sempre uno Store come argomento per il costruttore. Ad esempio, se il linguaggio DSL definisce una classe denominata Example:

Example element = new Example (theStore);

Mantenere gli oggetti nello Store, anziché come oggetti ordinari, offre diversi vantaggi.

  • Transazioni. È possibile raggruppare una serie di modifiche correlate in una transazione:

    using (Transaction t = store.TransactionManager.BeginTransaction("updates"))
    {
      // make several changes to Store elements here
      t.Commit();
    }
    

    Se si verifica un'eccezione durante le modifiche, in modo che l'ultima Commit() non venga eseguita, lo Store viene reimpostato sullo stato precedente. Questo approccio consente di assicurarsi che gli errori non lascino il modello in uno stato incoerente. Per altre informazioni, vedere Esplorazione e aggiornamento di un modello nel codice del programma.

  • Relazioni binarie. Se si definisce una relazione tra due classi, le istanze a entrambe le estremità hanno una proprietà che passa all'altra estremità. Le due estremità vengono sempre sincronizzate. Ad esempio, se si definisce una relazione di parentità con ruoli denominati Genitori e Figli, è possibile scrivere:

    John.Children.Add(Mary)

    Entrambe le espressioni seguenti sono ora vere:

    John.Children.Contains(Mary)

    Mary.Parents.Contains(John)

    È anche possibile ottenere lo stesso effetto scrivendo:

    Mary.Parents.Add(John)

    Per altre informazioni, vedere Esplorazione e aggiornamento di un modello nel codice del programma.

  • Regole ed eventi. È possibile definire regole che vengono attivate ogni volta che vengono apportate modifiche specificate. Le regole vengono utilizzate, ad esempio, per mantenere aggiornate le forme nel diagramma con gli elementi del modello presenti. Per altre informazioni, vedere Risposta a e propagazione delle modifiche.

  • Serializzazione. Lo Store offre un modo standard per serializzare gli oggetti contenuti in un file. È possibile personalizzare le regole per la serializzazione e la deserializzazione. Per altre informazioni, vedere Personalizzazione di Archiviazione file e serializzazione XML.