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.City e 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
In DslDefinition.dsl selezionare la proprietà di dominio nel diagramma o in Dsl Explorer.
Nella finestra Proprietà impostare il campo Kind su Calculated o Custom Archiviazione.
Assicurarsi di aver impostato anche il tipo su quello desiderato.
Selezionare Trasforma tutti i modelli nella barra degli strumenti di Esplora soluzioni.
Scegliere Compila soluzione dal menu Compila.
Viene visualizzato il messaggio di errore seguente: "<YourClass> non contiene una definizione per Get<YourProperty>".
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.
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.
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; } } }
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.Compilare ed eseguire la soluzione.
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.