Pisanie kodu, aby dostosować język specyficzne dla domeny
W tej sekcji przedstawiono sposób użycia kodu niestandardowego do dostępu, zmodyfikować lub utworzyć model w języku specyficzne dla domeny.
Istnieje wiele kontekstów, w których można napisać kod, który działa z modemu DSL:
Polecenia niestandardowe. Można utworzyć polecenia, że użytkownicy mogą być wywoływane przez kliknięcie prawym przyciskiem myszy na diagramie i które można modyfikować modelu.Aby uzyskać więcej informacji, zobacz Jak: Dodawanie polecenia do Menu skrótów.
Sprawdzanie poprawności. Można napisać kod, który sprawdza, że model jest w odpowiednim stanie.Aby uzyskać więcej informacji, zobacz Sprawdzanie poprawności w języku specyficzne dla domeny.
Zastępowanie zachowania domyślnego. Można zmodyfikować wiele aspektów kod, który jest generowany na podstawie DslDefinition.dsl.Aby uzyskać więcej informacji, zobacz Zastępowanie i rozszerzanie klas generowanych.
Transformacja tekstu. Można napisać tekst szablony, które zawierają kod, który uzyskuje dostęp do modelu i generuje plik tekstowy, na przykład do generowania kodu programu.Aby uzyskać więcej informacji, zobacz Generowanie kodu w języku specyficzne dla domeny.
Inne rozszerzenia programu Visual Studio. Można napisać oddzielnych rozszerzenia VSIX, które odczytywać i modyfikować modeli.Aby uzyskać więcej informacji zobaczJak: Otwórz Model z pliku kodu programu
Wystąpienia klas, które definiują w DslDefinition.dsl są przechowywane w strukturze danych, nazywane Magazyn W pamięci (ISP) lub Magazyn.Klas, które można zdefiniować w DSL zawsze podjąć magazynu jako argument do konstruktora.Na przykład, jeśli modem DSL definiuje klasę o nazwie przykład:
Example element = new Example (theStore);
Przechowywanie obiektów w magazynie (zamiast po prostu jako zwykłe obiektów) zapewnia kilka korzyści.
Transakcje.Można grupować serii powiązanych zmian do transakcji:
using (Transaction t = store.TransactionManager.BeginTransaction("updates"))
{
// make several changes to Store elements here
t.Commit();
}
Jeśli wystąpi wyjątek podczas zmiany, tak aby końcowe Commit() nie jest wykonywane, magazynu zostaną zresetowane do poprzedniego stanu.Pomaga upewnić się, że błędy nie opuszczą modelu w niespójnym stanie.Aby uzyskać więcej informacji, zobacz Przeglądanie i aktualizowanie modelu w kod programu.
Relacje dwuelementowe.W przypadku zdefiniowania relacji między dwoma klasami, wystąpienia na obu końcach mają właściwość, która przechodzi do drugiego końca.Dwa końce są zawsze zsynchronizowane.Na przykład jeśli zdefiniować relację rodzicielstwa z rolami o nazwie rodziców i dzieci, można napisać:
John.Children.Add(Mary)
Oba z następujących wyrażeń, teraz są spełnione:
John.Children.Contains(Mary)
Mary.Parents.Contains(John)
Może również osiągnąć ten sam efekt, pisząc:
Mary.Parents.Add(John)
Aby uzyskać więcej informacji, zobacz Przeglądanie i aktualizowanie modelu w kod programu.
Zasady i zdarzenia.Można zdefiniować reguły, które ognia w każdym przypadku, gdy określonych zmian.Zasady są używane na przykład, aby zachować aktualne elementy modelu, jakie stanowią kształty na diagramie.Aby uzyskać więcej informacji, zobacz Reagowanie na i propagowanie zmian.
Serializacja.Magazyn, udostępnia standardowy sposób serializować obiektów, które zawiera plik.Można dostosować reguły do szeregowania i deserializacji.Aby uzyskać więcej informacji, zobacz Dostosowywanie pliku magazynu i serializacji XML.