Pisanie kodu pod kątem dostosowywania języka specyficznego 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 Porady: 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 specyficznym 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 wygenerowanych klas.
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 z języka specyficznego dla domeny.
Inne rozszerzenia programu Visual Studio. Można napisać oddzielnych rozszerzenia VSIX, które odczytywać i modyfikować modeli.Aby uzyskać więcej informacji zobaczPorady: otwieranie modelu z pliku w kodzie 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 Nawigowanie i aktualizowanie modelu w kodzie 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 Nawigowanie i aktualizowanie modelu w kodzie 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 Odpowiadanie na zmiany 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 przechowywania plików i serializacji XML.
Zobacz też
Koncepcje
Dostosowywanie i rozszerzanie języka specyficznego dla domeny