このセクションでは、カスタム コードを使用して、ドメイン固有言語 (DSL) でモデルにアクセス、変更、または作成する方法について説明します。
DSL のコードを記述するためのコンテキスト
DSL で動作するコードを記述できるコンテキストがいくつかあります。
カスタム コマンド。 ユーザーがダイアグラムを右クリックして呼び出すことができるコマンドを作成し、モデルを変更できます。 詳細については、「 方法: ショートカット メニューにコマンドを追加する」を参照してください。
検証。 モデルが正しい状態であることを確認するコードを記述できます。 詳細については、「 Domain-Specific 言語での検証」を参照してください。
既定の動作をオーバーライドする。 DslDefinition.dsl から生成されるコードの多くの側面を変更できます。 詳細については、「 生成されたクラスのオーバーライドと拡張」を参照してください。
テキスト変換。 モデルにアクセスしてテキスト ファイルを生成するコードを含むテキスト テンプレートを記述できます 。たとえば、プログラム コードを生成します。 詳細については、「 Domain-Specific 言語からのコードの生成」を参照してください。
その他の Visual Studio 拡張機能。 モデルの読み取りと変更を行う個別の VSIX 拡張機能を記述できます。 詳細については、「方法: プログラム コードでファイルからモデルを開く」を参照してください。
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 シリアル化のカスタマイズ」を参照してください。