Eseguire l'override ed estendere le classi generate
La definizione DSL è una piattaforma in cui è possibile creare un potente set di strumenti basato su un linguaggio specifico del dominio. Molte estensioni e adattazioni possono essere apportate eseguendo l'override e estendendo le classi generate dalla definizione DSL. Queste classi includono non solo le classi di dominio definite in modo esplicito nel diagramma di definizione DSL, ma anche altre classi che definiscono la casella degli strumenti, Esplora risorse, serializzazione e così via.
Meccanismi di estendibilità
Sono disponibili diversi meccanismi per consentire di estendere il codice generato.
Eseguire l'override dei metodi in una classe parziale
Le definizioni di classi parziali consentono di definire una classe in più posizioni. In questo modo è possibile separare il codice generato dal codice scritto manualmente. Nel codice scritto manualmente è possibile eseguire l'override delle classi ereditate dal codice generato.
Ad esempio, se nella definizione DSL si definisce una classe di dominio denominata Book
, è possibile scrivere codice personalizzato che aggiunge metodi di override:
public partial class Book
{
protected override void OnDeleting()
{
MessageBox.Show("Deleting book " + this.Title);
base.OnDeleting();
}
}
Nota
Per eseguire l'override dei metodi in una classe generata, scrivere sempre il codice in un file separato dai file generati. In genere, il file è contenuto in una cartella denominata CustomCode. Se si apportano modifiche al codice generato, queste andranno perse quando si rigenera il codice dalla definizione DSL.
Per individuare i metodi di cui è possibile eseguire l'override, digitare override nella classe , seguito da uno spazio. La descrizione comando di IntelliSense indicherà quali metodi possono essere sottoposti a override.
Classi derivate da due classi
La maggior parte dei metodi nelle classi generate viene ereditata da un set fisso di classi negli spazi dei nomi di modellazione. Tuttavia, alcuni metodi sono definiti nel codice generato. In genere, ciò significa che non è possibile eseguirne l'override; Non è possibile eseguire l'override in una classe parziale dei metodi definiti in un'altra definizione parziale della stessa classe.
Tuttavia, è possibile eseguire l'override di questi metodi impostando il flag Generate Double Derived per la classe di dominio. In questo modo vengono generate due classi, una è una classe base astratta dell'altra. Tutte le definizioni di metodo e proprietà si trovano nella classe base e solo il costruttore si trova nella classe derivata.
Ad esempio, nell'esempio Library.dsl la CirculationBook
classe di dominio ha la Generates``Double Derived
proprietà impostata su true
. Il codice generato per la classe di dominio contiene due classi:
CirculationBookBase
, che è un'astrazione e che contiene tutti i metodi e le proprietà.CirculationBook
, derivato daCirculationBookBase
. È vuoto, ad eccezione dei relativi costruttori.
Per eseguire l'override di qualsiasi metodo, creare una definizione parziale della classe derivata, ad CirculationBook
esempio . È possibile eseguire l'override sia dei metodi generati che dei metodi ereditati dal framework di modellazione.
È possibile usare questo metodo con tutti i tipi di elemento, inclusi elementi del modello, relazioni, forme, diagrammi e connettori. È anche possibile eseguire l'override dei metodi di altre classi generate. Alcune classi generate, ad esempio ToolboxHelper, sono sempre derivate a doppio.
Costruttori personalizzati
Non è possibile eseguire l'override di un costruttore. Anche nelle classi derivate doppie, il costruttore deve trovarsi nella classe derivata.
Se si vuole fornire il proprio costruttore, è possibile farlo impostando Has Custom Constructor
per la classe di dominio nella definizione DSL. Quando si fa clic su Trasforma tutti i modelli, il codice generato non includerà un costruttore per tale classe. Includerà una chiamata al costruttore mancante. In questo modo viene generato un report di errore durante la compilazione della soluzione. Fare doppio clic sul report degli errori per visualizzare un commento nel codice generato che spiega cosa fornire.
Scrivere una definizione di classe parziale in un file separato dai file generati e fornire il costruttore.
Punti di estensione contrassegnati
Un punto di estensione contrassegnato è una posizione nella definizione DSL in cui è possibile impostare una proprietà o una casella di controllo per indicare che si fornirà un metodo personalizzato. I costruttori personalizzati sono un esempio. Altri esempi includono l'impostazione Kind
di una proprietà di dominio su Calculated o Custom Archiviazione o l'impostazione del flag Is Custom in un generatore di connessioni.
In ogni caso, quando si imposta il flag e si rigenera il codice, verrà generato un errore di compilazione. Fare doppio clic sull'errore per visualizzare un commento che spiega cosa è necessario fornire.
Regole
Gestione transazioni consente di definire regole eseguite prima della fine di una transazione in cui si è verificato un evento designato, ad esempio una modifica in una proprietà. Le regole vengono in genere usate per mantenere la sincronizzazione tra diversi elementi nell'archivio. Ad esempio, le regole vengono usate per assicurarsi che il diagramma visualizzi lo stato corrente del modello.
Le regole vengono definite per ogni classe, in modo che non sia necessario disporre di codice che registra la regola per ogni oggetto. Per altre informazioni, vedere Regole propagate modifiche all'interno del modello.
Eventi dello Store
L'archivio di modellazione fornisce un meccanismo di evento che è possibile usare per ascoltare tipi specifici di modifiche nell'archivio, tra cui l'aggiunta e l'eliminazione di elementi, le modifiche ai valori delle proprietà e così via. I gestori eventi vengono chiamati dopo la chiusura della transazione in cui sono state apportate le modifiche. In genere, questi eventi vengono usati per aggiornare le risorse all'esterno dell'archivio.
Eventi .NET
È possibile sottoscrivere alcuni eventi sulle forme. Ad esempio, è possibile ascoltare i clic del mouse su una forma. È necessario scrivere codice che sottoscrive l'evento per ogni oggetto. Questo codice può essere scritto in un override di InitializeInstanceResources().
Alcuni eventi vengono generati in ShapeFields, che vengono utilizzati per disegnare elementi decorati su una forma. Per un esempio, vedere Procedura: Intercettare un clic su una forma o un elemento Decorator.
Questi eventi in genere non si verificano all'interno di una transazione. È consigliabile creare una transazione se si desidera apportare modifiche nell'archivio.