Skriva kod för att anpassa ett domänspecifikt språk

Det här avsnittet visar hur du använder anpassad kod för att komma åt, ändra eller skapa en modell på ett domänspecifikt språk (DSL).

Kontext för att skriva kod för en DSL

Det finns flera kontexter där du kan skriva kod som fungerar med en DSL:

In-Memory Store

Instanser av de klasser som du definierar i DslDefinition.dsl lagras i en datastruktur som kallas In-Memory Store (IMS) eller Store. De klasser som du definierar i en DSL tar alltid en Store som ett argument till konstruktorn. Om din DSL till exempel definierar en klass med namnet Example:

Example element = new Example (theStore);

Att behålla objekt i Store, i stället för precis som vanliga objekt, ger flera fördelar.

  • Transaktioner. Du kan gruppera en serie relaterade ändringar i en transaktion:

    using (Transaction t = store.TransactionManager.BeginTransaction("updates"))
    {
      // make several changes to Store elements here
      t.Commit();
    }
    

    Om ett undantag inträffar under ändringarna, vilket gör att det sista Commit() inte utförs, återställs butiken till sitt tidigare tillstånd. Den här metoden hjälper dig att se till att felen inte lämnar modellen i ett inkonsekvent tillstånd. Mer information finns i Navigera och uppdatera en modell i Programkod.

  • Binära relationer. Om du definierar en relation mellan två klasser har instanser i båda ändar en egenskap som navigerar till den andra änden. De två ändarna synkroniseras alltid. Om du till exempel definierar en föräldraskapsrelation med roller med namnet Föräldrar och barn kan du skriva:

    John.Children.Add(Mary)

    Båda följande uttryck är nu sanna:

    John.Children.Contains(Mary)

    Mary.Parents.Contains(John)

    Du kan också uppnå samma effekt genom att skriva:

    Mary.Parents.Add(John)

    Mer information finns i Navigera och uppdatera en modell i Programkod.

  • Regler och händelser. Du kan definiera regler som utlöses när angivna ändringar görs. Regler används till exempel för att hålla formerna i diagrammet uppdaterade med de modellelement som de presenterar. Mer information finns i Svara på och sprida ändringar.

  • Serialisering. Butiken tillhandahåller ett standardiserat sätt att serialisera de objekt som den innehåller till en fil. Du kan anpassa reglerna för serialisering och deserialisering. Mer information finns i Anpassa fillagring och XML-serialisering.