Udostępnij przez


Zastępowanie i rozszerzanie wygenerowanych klas

Twoja definicja DSL to platforma, na której można zbudować potężny zestaw narzędzi opartych na języku specyficznym dla domeny. Wiele rozszerzeń i adaptacji można wykonać przez zastąpienie i rozszerzenie klas generowanych na podstawie definicji DSL. Te klasy obejmują nie tylko klasy domeny, które zostały jawnie zdefiniowane na diagramie definicji DSL, ale także inne klasy definiujące narzędziownię, eksplorator, serializację itd.

Mechanizmy rozszerzalności

Dostępnych jest kilka mechanizmów umożliwiających rozszerzenie wygenerowanego kodu.

Przesłanianie metod w klasie częściowej

Częściowe definicje klas umożliwiają definiowanie klasy w więcej niż jednym miejscu. Dzięki temu można oddzielić wygenerowany kod od kodu, który samodzielnie piszesz. W swoim ręcznie napisanym kodzie można przedefiniować klasy odziedziczone przez wygenerowany kod.

Jeśli na przykład w definicji DSL zdefiniujesz klasę domeny o nazwie Book, możesz napisać kod niestandardowy, który dodaje metody zastąpienia:

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

Uwaga / Notatka

Aby zastąpić metody w wygenerowanej klasie, zawsze napisz kod w pliku oddzielonym od wygenerowanych plików. Zazwyczaj plik znajduje się w folderze o nazwie CustomCode. Jeśli wprowadzisz zmiany w wygenerowany kod, zostaną one utracone po wygenerowaniu kodu z definicji DSL.

Aby sprawdzić, które metody można nadpisać, wpisz override w klasie programu, a następnie spację. Etykietka narzędzia IntelliSense informuje o tym, jakie metody można zastąpić.

klasy pośrednie

Większość metod w wygenerowanych klasach jest dziedziczona z stałego zestawu klas w przestrzeniach nazw modelowania. Jednak niektóre metody są zdefiniowane w wygenerowanym kodzie. Zazwyczaj oznacza to, że nie można ich zastąpić; w jednej klasie częściowej nie można zastąpić metod zdefiniowanych w innej częściowej definicji tej samej klasy.

Można jednak zastąpić te metody, ustawiając flagę Generates Double Derived dla klasy domeny. Powoduje to wygenerowanie dwóch klas, z których jedna jest abstrakcyjną klasą bazową drugiej. Wszystkie definicje metody i właściwości znajdują się w klasie bazowej, a tylko konstruktor znajduje się w klasie pochodnej.

Na przykład, w przykładowej bibliotece.dsl klasa domeny CirculationBook ma właściwość Generates``Double Derived ustawioną na true. Wygenerowany kod dla tej klasy domeny zawiera dwie klasy:

  • CirculationBookBase, który jest abstrakcyjny i który zawiera wszystkie metody i właściwości.

  • CirculationBook, który pochodzi z CirculationBookBase. Jest on pusty, z wyjątkiem jego konstruktorów.

Aby zastąpić dowolną metodę, należy utworzyć częściową definicję klasy pochodnej, taką jak CirculationBook. Można zastąpić zarówno wygenerowane metody, jak i metody dziedziczone ze struktury modelowania.

Tej metody można używać ze wszystkimi typami elementów, w tym elementami modelu, relacjami, kształtami, diagramami i łącznikami. Można również zastąpić metody innych wygenerowanych klas. Niektóre wygenerowane klasy, takie jak ToolboxHelper, są zawsze podwójnie dziedziczone.

Konstruktory niestandardowe

Nie można zastąpić konstruktora. Nawet w podwójnie pochodnych klasach konstruktor musi znajdować się w klasie pochodnej.

Jeśli chcesz podać własny konstruktor, możesz to zrobić, ustawiając Has Custom Constructor dla klasy domeny w definicji DSL. Po kliknięciu przycisku Przekształć wszystkie szablony wygenerowany kod nie będzie zawierać konstruktora dla tej klasy. Będzie zawierać wywołanie brakującego konstruktora. Spowoduje to wyświetlenie raportu o błędach podczas tworzenia rozwiązania. Kliknij dwukrotnie raport o błędach, aby wyświetlić komentarz w wygenerowanym kodzie, który wyjaśnia, co należy podać.

Napisz definicję klasy częściowej w pliku, który jest oddzielony od wygenerowanych plików i podaj konstruktor.

Oznaczone punkty rozszerzenia

Oflagowany punkt rozszerzenia to miejsce w definicji DSL, gdzie można ustawić właściwość lub pole wyboru, aby wskazać, że dostarczy się metodę niestandardową. Konstruktory niestandardowe są jednym z przykładów. Inne przykłady obejmują ustawienie Kind właściwości domeny na wartość Calculated lub Custom Storage lub ustawienie flagi Is Custom w konstruktorze połączenia.

W każdym przypadku po ustawieniu flagi i wygenerowaniu kodu zostanie wyświetlony błąd kompilacji. Kliknij dwukrotnie błąd, aby wyświetlić komentarz wyjaśniający, co należy podać.

Reguły

Menedżer transakcji umożliwia definiowanie reguł uruchamianych przed końcem transakcji, w której wystąpiło wyznaczone zdarzenie, takie jak zmiana właściwości. Reguły są zwykle używane do utrzymania synchronizacji między różnymi elementami w magazynie. Na przykład reguły służą do upewnienia się, że na diagramie jest wyświetlany bieżący stan modelu.

Reguły są definiowane dla poszczególnych klas, dzięki czemu nie trzeba mieć kodu, który rejestruje regułę dla każdego obiektu. Aby uzyskać więcej informacji, zobacz Reguły propagacji zmian w modelu.

Wydarzenia w sklepie

Magazyn modelowania zapewnia mechanizm zdarzeń, który można wykorzystać do nasłuchiwania konkretnych typów zmian w sklepie, takich jak dodawanie i usuwanie elementów, zmiany wartości właściwości i inne. Procedury obsługi zdarzeń są wywoływane po zamknięciu transakcji, w której wprowadzono zmiany. Zazwyczaj te zdarzenia są używane do aktualizacji zasobów poza sklepem.

Zdarzenia platformy .NET

Możesz subskrybować niektóre zdarzenia dotyczące kształtów. Na przykład możesz nasłuchiwać kliknięć myszką na kształcie. Musisz napisać kod, który subskrybuje zdarzenie dla każdego obiektu. Ten kod można napisać, nadpisując metodę InitializeInstanceResources().

Niektóre zdarzenia są generowane na polach ShapeFields, które są używane do rysowania dekoratorów na kształcie. Przykład można znaleźć w temacie How to: Intercept a Click on a Shape or Decorator (Jak przechwytywać kliknięcie kształtu lub dekoratora).

Te zdarzenia zwykle nie występują wewnątrz transakcji. Jeśli chcesz wprowadzić zmiany w sklepie, należy utworzyć transakcję.