次の方法で共有


ドメイン固有の言語をカスタマイズするコードを記述する

このセクションでは、カスタム コードを使用して、ドメイン固有言語 (DSL) でモデルにアクセス、変更、または作成する方法について説明します。

DSL のコードを記述するためのコンテキスト

DSL で動作するコードを記述できるコンテキストがいくつかあります。

In-Memory ストア

DslDefinition.dsl で定義するクラスのインスタンスは、In-Memory ストア (IMS) またはストアと呼ばれるデータ構造に保持されます。 DSL で定義するクラスは、常にストアをコンストラクターの引数として受け取ります。 たとえば、DSL で Example というクラスが定義されている場合は、次のようになります。

Example element = new Example (theStore);

通常のオブジェクトではなく、ストアにオブジェクトを保持すると、いくつかの利点があります。

  • トランザクション。 関連する一連の変更をトランザクションにグループ化できます。

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

    変更中に例外が発生し、最終的な Commit() が実行されないようにすると、ストアは以前の状態にリセットされます。 この方法は、エラーによってモデルが不整合な状態にならないようにするのに役立ちます。 詳細については、「 プログラム コードでのモデルの移動と更新」を参照してください。

  • バイナリ リレーションシップ。 2 つのクラス間のリレーションシップを定義する場合、両端のインスタンスには、もう一方の端に移動するプロパティがあります。 両端は常に同期されます。 たとえば、親とという名前のロールとの親の関係を定義する場合は、次のように記述できます。

    John.Children.Add(Mary)

    次の式の両方が true になりました。

    John.Children.Contains(Mary)

    Mary.Parents.Contains(John)

    また、次の記述で同じ効果を得ることもできます。

    Mary.Parents.Add(John)

    詳細については、「 プログラム コードでのモデルの移動と更新」を参照してください。

  • ルールとイベント。 指定した変更が行われるたびに適用されるルールを定義できます。 ルールは、たとえば、ダイアグラム上の図形を、存在するモデル要素と共に最新の状態に保つために使用されます。 詳細については、「 変更への対応と反映」を参照してください。

  • シリアル化。 ストアには、格納されているオブジェクトをファイルにシリアル化する標準的な方法が用意されています。 シリアル化と逆シリアル化の規則をカスタマイズできます。 詳細については、「 ファイル ストレージと XML シリアル化のカスタマイズ」を参照してください。