Condividi tramite


Proprietà di archiviazione calcolate e personalizzate

Tutte le proprietà di dominio in un linguaggio specifico del dominio (DSL) possono essere visualizzate all'utente nel diagramma e in Esplora lingue ed è accessibile dal codice del programma. Tuttavia, le proprietà differiscono nel modo in cui vengono archiviati i relativi valori.

Tipi di proprietà di dominio

Nella definizione DSL è possibile impostare il tipo di proprietà di un dominio, come indicato nella tabella seguente:

Tipo di proprietà di dominio Descrizione
Standard (impostazione predefinita) Proprietà di dominio salvata nell'archivio e serializzata nel file.
Calcolato Proprietà di dominio di sola lettura che non viene salvata nell'archivio, ma calcolata da altri valori. Ad esempio, Person.Age può essere calcolato da Person.BirthDate. È necessario fornire il codice che esegue il calcolo. In genere, si calcola il valore da altre proprietà di dominio. Tuttavia, è anche possibile usare risorse esterne.
Archiviazione personalizzate Proprietà di dominio che non viene salvata direttamente nell'archivio, ma che può essere sia get che set. È necessario fornire i metodi che ottengono e impostano il valore. Ad esempio, Person.FullAddress può essere archiviato in Person.StreetAddress, Person.Citye Person.PostalCode. È anche possibile accedere a risorse esterne, ad esempio per ottenere e impostare valori da un database. Il codice non deve impostare i valori nell'archivio quando Store.InUndoRedoOrRollback è true. Vedere Transazioni e setter personalizzati.

Specifica del codice per una proprietà di archiviazione

Se si imposta il tipo di proprietà di un dominio su una risorsa di archiviazione calcolata o personalizzata, è necessario fornire metodi di accesso. Quando si compila la soluzione, un report degli errori indica cosa è necessario.

Per definire una proprietà di archiviazione calcolata o personalizzata

  1. In DslDefinition.dsl selezionare la proprietà di dominio nel diagramma o in Dsl Explorer.

  2. Nella finestra Proprietà impostare il campo Kind su Calculated o Custom Archiviazione.

    Assicurarsi di aver impostato anche il tipo su quello desiderato.

  3. Selezionare Trasforma tutti i modelli nella barra degli strumenti di Esplora soluzioni.

  4. Scegliere Compila soluzione dal menu Compila.

    Viene visualizzato il messaggio di errore seguente: "<YourClass> non contiene una definizione per Get<YourProperty>".

  5. Fare doppio clic sul messaggio di errore.

    Viene aperto Dsl\GeneratedCode\DomainClasses.cs o DomainRelationships.cs . Sopra la chiamata al metodo evidenziato, un commento richiede di fornire un'implementazione per Get<YourProperty>().

    Nota

    Questo file viene generato da DslDefinition.dsl. Se si modifica questo file, le modifiche andranno perse alla successiva selezione di Trasforma tutti i modelli. Aggiungere invece il metodo obbligatorio in un file separato.

  6. Creare o aprire un file di classe in una cartella separata, ad esempio CustomCode\<YourDomainClass.cs>.

    Assicurarsi che lo spazio dei nomi sia uguale a quello nel codice generato.

  7. Nel file di classe scrivere un'implementazione parziale della classe di dominio. Nella classe scrivere una definizione per il metodo mancante Get simile all'esempio seguente:

    namespace Company.FamilyTree
    {  
      public partial class Person
      {
        int GetAgeValue()
        {
          return System.DateTime.Today.Year - this.BirthYear;
        }
      }
    }
    
  8. Se si imposta Kind su Custom Archiviazione, è necessario specificare anche un Set metodo. Ad esempio:

    void SetAgeValue(int value)
    {
      if (!Store.InUndoRedoOrRollback) this.BirthYear = System.DateTime.Today.Year - value;
    }
    

    Il codice non deve impostare i valori nell'archivio quando Store.InUndoRedoOrRollback è true. Vedere Transazioni e setter personalizzati.

  9. Compilare ed eseguire la soluzione.

  10. Testare la proprietà . Assicurarsi di provare Annulla e Ripeti.

Transazioni e setter personalizzati

set Nel metodo della proprietà Custom Archiviazione non è necessario aprire una transazione. Il metodo viene in genere chiamato all'interno di una transazione attiva.

Tuttavia, il set metodo potrebbe anche essere chiamato se l'utente richiama Annulla o Ripeti o se viene eseguito il rollback di una transazione. Quando InUndoRedoOrRollback è true, il set metodo deve comportarsi nel modo seguente:

  • Non deve apportare modifiche nell'archivio, ad esempio l'assegnazione di valori ad altre proprietà di dominio. Il gestore di annullamento imposta i relativi valori.

  • Tuttavia, deve aggiornare qualsiasi risorsa esterna, ad esempio il contenuto del database o del file o gli oggetti all'esterno dell'archivio. Questo approccio assicura che siano mantenuti sincronizzati con i valori nell'archivio.

    Ad esempio:

    void SetAgeValue(int value)
    {
      // If we are in Undo, no changes to Store objects:
      if (!this.Store.InUndoRedoOrRollback)
      {
        this.BirthYear = System.DateTime.Today.Year - value;
      }
      // But always update external objects:
      System.IO.File.WriteAllText(AgeFile, value);
    }
    

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