Pisanie kodu w celu dostosowania języka specyficznego dla domeny
W tej sekcji pokazano, jak używać kodu niestandardowego do uzyskiwania dostępu do, modyfikowania lub tworzenia modelu w języku specyficznym dla domeny (DSL).
Kontekst do pisania kodu dla języka DSL
Istnieje kilka kontekstów, w których można napisać kod, który działa z językiem DSL:
Polecenia niestandardowe. Możesz utworzyć polecenie, które użytkownicy mogą wywołać, klikając prawym przyciskiem myszy diagram i który może modyfikować model. Aby uzyskać więcej informacji, zobacz How to: Add a Command to the Shortcut Menu (Instrukcje: Dodawanie polecenia do menu skrótów).
Sprawdzania poprawności. Możesz napisać kod, który weryfikuje, czy model jest w prawidłowym stanie. Aby uzyskać więcej informacji, zobacz Walidacja w języku specyficznym dla domeny.
Zastępowanie zachowania domyślnego. Można zmodyfikować wiele aspektów kodu wygenerowanego na podstawie pliku DslDefinition.dsl. Aby uzyskać więcej informacji, zobacz Zastępowanie i rozszerzanie wygenerowanych klas.
Przekształcanie tekstu. Możesz napisać szablony tekstowe zawierające kod, który uzyskuje dostęp do modelu i generuje plik tekstowy, na przykład w celu wygenerowania kodu programu. Aby uzyskać więcej informacji, zobacz Generowanie kodu z języka specyficznego dla domeny.
Inne rozszerzenia programu Visual Studio. Możesz napisać oddzielne rozszerzenia VSIX, które odczytują i modyfikują modele. Aby uzyskać więcej informacji, zobacz How to: Open a Model from File in Program Code (Instrukcje: otwieranie modelu z pliku w kodzie programu)
Magazyn w pamięci
Wystąpienia klas zdefiniowanych w pliku DslDefinition.dsl są przechowywane w strukturze danych o nazwie In-Memory Store (IMS) lub Store. Klasy zdefiniowane w języku DSL zawsze przyjmują magazyn jako argument konstruktora. Jeśli na przykład język DSL definiuje klasę o nazwie Example
:
Example element = new Example (theStore);
Utrzymywanie obiektów w magazynie, a nie tak samo zwykłych obiektów, zapewnia kilka korzyści.
Transakcje. Serię powiązanych zmian można zgrupować w transakcji:
using (Transaction t = store.TransactionManager.BeginTransaction("updates")) { // make several changes to Store elements here t.Commit(); }
Jeśli wystąpi wyjątek podczas zmian, aby finał
Commit()
nie został wykonany, sklep zostanie zresetowany do poprzedniego stanu. Takie podejście pomaga upewnić się, że błędy nie opuszczają modelu w stanie niespójnym. Aby uzyskać więcej informacji, zobacz Nawigowanie i aktualizowanie modelu w kodzie programu.Relacje binarne. Jeśli zdefiniujesz relację między dwiema klasami, wystąpienia na obu końcach mają właściwość, która przechodzi do drugiego końca. Dwa końce są zawsze synchronizowane. Jeśli na przykład zdefiniujesz relację rodzicielstwa z rolami o nazwie Rodzice i Dzieci, możesz napisać:
John.Children.Add(Mary)
Oba następujące wyrażenia są teraz prawdziwe:
John.Children.Contains(Mary)
Mary.Parents.Contains(John)
Możesz również osiągnąć ten sam efekt, pisząc:
Mary.Parents.Add(John)
Aby uzyskać więcej informacji, zobacz Nawigowanie i aktualizowanie modelu w kodzie programu.
Reguły i zdarzenia. Można zdefiniować reguły uruchamiane za każdym razem, gdy zostaną wprowadzone określone zmiany. Reguły są używane, na przykład, aby zachować aktualność kształtów na diagramie z prezentowanymi elementami modelu. Aby uzyskać więcej informacji, zobacz Odpowiadanie na zmiany i propagowanie ich.
Serializacja. Magazyn zapewnia standardowy sposób serializacji obiektów, które zawiera w pliku. Możesz dostosować reguły serializacji i deserializacji. Aby uzyskać więcej informacji, zobacz Dostosowywanie magazynu plików i serializacji XML.