Přepsání a rozšíření vygenerovaných tříd

Definice DSL je platforma, na které můžete vytvořit výkonnou sadu nástrojů založených na jazyce specifickém pro doménu. Mnoho rozšíření a úprav lze provést přepsáním a rozšířením tříd generovaných z definice DSL. Tyto třídy zahrnují nejen třídy domény, které jste explicitně definovali v diagramu definice DSL, ale také další třídy, které definují sadu nástrojů, průzkumníka, serializace atd.

Mechanismy rozšiřitelnosti

K dispozici je několik mechanismů, které vám umožní rozšířit vygenerovaný kód.

Přepsání metod v částečné třídě

Částečné definice tříd umožňují definovat třídu na více než jednom místě. To vám umožní oddělit vygenerovaný kód od kódu, který píšete sami. V ručně napsaný kód můžete přepsat třídy zděděné vygenerovaným kódem.

Pokud například v definici DSL definujete třídu domény s názvem Book, můžete napsat vlastní kód, který přidává metody přepsání:

public partial class Book
{
   protected override void OnDeleting()
   {
      MessageBox.Show("Deleting book " + this.Title);
      base.OnDeleting();
   }
}

Poznámka:

Chcete-li přepsat metody ve vygenerované třídě, vždy zapište kód do souboru, který je oddělený od vygenerovaných souborů. Soubor je obvykle obsažen ve složce s názvem CustomCode. Pokud vygenerovaný kód změníte, při opětovném vygenerování kódu z definice DSL dojde ke ztrátě.

Pokud chcete zjistit, jaké metody můžete přepsat, zadejte přepsání ve třídě následované mezerou. Popis IntelliSense vám řekne, jaké metody je možné přepsat.

Dvojité odvozené třídy

Většina metod v generovaných třídách se dědí z pevné sady tříd v oborech názvů modelování. Některé metody jsou však definovány ve vygenerovaném kódu. Obvykle to znamená, že je nemůžete přepsat; V jedné částečné třídě nelze přepsat metody definované v jiné částečné definici stejné třídy.

Nicméně můžete přepsat tyto metody nastavením Generates Double Derived příznak pro třídu domény. To způsobí, že se vygenerují dvě třídy, jedna je abstraktní základní třída druhé. Všechny definice metody a vlastností jsou v základní třídě a pouze konstruktor je v odvozené třídě.

Například v ukázkové Library.dsl CirculationBook má třída domény vlastnost nastavena Generates``Double Derived na true. Vygenerovaný kód pro danou třídu domény obsahuje dvě třídy:

  • CirculationBookBase, což je abstraktní a který obsahuje všechny metody a vlastnosti.

  • CirculationBook, který je odvozen z CirculationBookBase. Je prázdný, s výjimkou jeho konstruktorů.

Chcete-li přepsat jakoukoli metodu, vytvoříte částečnou definici odvozené třídy, například CirculationBook. Vygenerované metody i metody zděděné z architektury modelování můžete přepsat.

Tuto metodu můžete použít se všemi typy prvků, včetně prvků modelu, relací, obrazců, diagramů a spojnic. Můžete také přepsat metody jiných generovaných tříd. Některé generované třídy, jako je ToolboxHelper, jsou vždy dvojitě odvozeny.

Vlastní konstruktory

Konstruktor nelze přepsat. I v dvojitých odvozených třídách musí být konstruktor v odvozené třídě.

Pokud chcete poskytnout vlastní konstruktor, můžete to provést nastavením Has Custom Constructor pro třídu domény v definici DSL. Když kliknete na transformovat všechny šablony, vygenerovaný kód nebude obsahovat konstruktor pro tuto třídu. Bude obsahovat volání chybějícího konstruktoru. To způsobí, že při sestavování řešení dojde k chybě. Poklikáním na zprávu o chybě zobrazíte komentář ve vygenerovaném kódu, který vysvětluje, co byste měli poskytnout.

Zapište částečnou definici třídy do souboru, který je oddělený od vygenerovaných souborů, a zadejte konstruktor.

Body rozšíření označené příznakem

Bod rozšíření s příznakem je místo v definici DSL, kde můžete nastavit vlastnost nebo zaškrtávací políčko, které označuje, že zadáte vlastní metodu. Příkladem jsou vlastní konstruktory. Mezi další příklady patří nastavení Kind vlastnosti domény na počítané nebo vlastní úložiště nebo nastavení příznaku Je vlastní v tvůrci připojení.

V každém případě, když nastavíte příznak a znovu vygenerujete kód, dojde k chybě sestavení. Poklikáním na chybu zobrazíte komentář, který vysvětluje, co musíte zadat.

Pravidla

Správce transakcí umožňuje definovat pravidla, která se spouští před koncem transakce, ve které došlo k určené události, jako je například změna vlastnosti. Pravidla se obvykle používají k zachování synchronizace mezi různými prvky v úložišti. Pravidla se například používají k zajištění toho, aby diagram zobrazoval aktuální stav modelu.

Pravidla jsou definována na základě jednotlivých tříd, takže nemusíte mít kód, který registruje pravidlo pro každý objekt. Další informace naleznete v tématu Pravidla šíření změn v rámci modelu.

Ukládání událostí

Úložiště modelování poskytuje mechanismus událostí, který můžete použít k naslouchání konkrétním typům změn v úložišti, včetně přidání a odstranění prvků, změn hodnot vlastností atd. Obslužné rutiny událostí jsou volány po uzavření transakce, ve které byly provedeny změny. Tyto události se obvykle používají k aktualizaci prostředků mimo úložiště.

Události .NET

Můžete se přihlásit k odběru některých událostí obrazců. Můžete například poslouchat kliknutí myší na obrazec. Musíte napsat kód, který se přihlásí k odběru události pro každý objekt. Tento kód lze zapsat v přepsání InitializeInstanceResources().

Některé události se generují na ShapeFields, které se používají k kreslení dekorátorů na obrazci. Příklad: Zachycení kliknutí na obrazec nebo dekorátor.

K těmto událostem obvykle nedochází uvnitř transakce. Pokud chcete provést změny v úložišti, měli byste vytvořit transakci.