次の方法で共有


生成されたクラスをオーバーライドして拡張する

DSL 定義は、ドメイン固有の言語に基づく強力なツール セットを構築できるプラットフォームです。 DSL 定義から生成されるクラスをオーバーライドして拡張することで、多くの拡張機能と適応を行うことができます。 これらのクラスには、DSL 定義図で明示的に定義したドメイン クラスだけでなく、ツールボックス、エクスプローラー、シリアル化などを定義する他のクラスも含まれます。

機能拡張メカニズム

生成されたコードを拡張できるように、いくつかのメカニズムが用意されています。

部分クラスのメソッドをオーバーライドする

部分クラス定義を使用すると、1 つのクラスを複数の場所で定義できます。 これにより、生成されたコードを自分で記述したコードから分離できます。 手動で記述したコードでは、生成されたコードによって継承されたクラスをオーバーライドできます。

たとえば、DSL 定義で Book という名前のドメイン クラスを定義する場合は、オーバーライド メソッドを追加するカスタム コードを記述できます。

public partial class Book
{
   protected override void OnDeleting()
   {
      MessageBox.Show("Deleting book " + this.Title);
      base.OnDeleting();
   }
}

生成されたクラスのメソッドをオーバーライドするには、常に生成されたファイルから分離されたファイルにコードを記述します。 通常、ファイルは CustomCode という名前のフォルダーに含まれています。 生成されたコードに変更を加えた場合、DSL 定義からコードを再生成すると、そのコードは失われます。

オーバーライドできるメソッドを検出するには、クラスで override を入力し、その後にスペースを入力します。 IntelliSense ツールヒントには、オーバーライドできるメソッドが表示されます。

二重派生クラス

生成されたクラスのほとんどのメソッドは、モデリング名前空間の固定されたクラス セットから継承されます。 ただし、生成されたコードでは一部のメソッドが定義されています。 通常、これはオーバーライドできないことを意味します。ある部分クラスで、同じクラスの別の部分定義で定義されているメソッドをオーバーライドすることはできません。

ただし、ドメイン クラスの [二重派生の生成 ] フラグを設定することで、これらのメソッドをオーバーライドできます。 これにより、2 つのクラスが生成され、1 つは他方の抽象基底クラスになります。 すべてのメソッドとプロパティの定義は基底クラスにあり、コンストラクターのみが派生クラスにあります。

たとえば、Library.dsl のサンプルでは、 CirculationBook ドメイン クラスの Generates``Double Derived プロパティが true に設定されています。 そのドメイン クラスの生成されたコードには、次の 2 つのクラスが含まれています。

  • CirculationBookBaseは抽象であり、すべてのメソッドとプロパティを含みます。

  • CirculationBookは、 CirculationBookBaseから派生します。 コンストラクターを除いて、他には何もありません。

メソッドをオーバーライドするには、 CirculationBookなどの派生クラスの部分的な定義を作成します。 生成されたメソッドと、モデリング フレームワークから継承されたメソッドの両方をオーバーライドできます。

このメソッドは、モデル要素、リレーションシップ、図形、図、コネクタなど、すべての種類の要素で使用できます。 他の生成されたクラスのメソッドをオーバーライドすることもできます。 ToolboxHelper などの一部の生成されたクラスは、常に二重派生です。

カスタム コンストラクター

コンストラクターをオーバーライドすることはできません。 二重派生クラスであっても、コンストラクターは派生クラスに存在する必要があります。

独自のコンストラクターを指定する場合は、DSL 定義でドメイン クラスの Has Custom Constructor を設定することでこれを行うことができます。 [ すべてのテンプレートの変換] をクリックすると、生成されたコードにそのクラスのコンストラクターは含まれません。 欠落しているコンストラクターへの呼び出しが含まれます。 これにより、ソリューションをビルドするときにエラー レポートが発生します。 エラー レポートをダブルクリックすると、生成されたコードに、指定する必要があることを説明するコメントが表示されます。

生成されたファイルとは別の部分クラス定義をファイルに書き込み、コンストラクターを指定します。

フラグ付き拡張ポイント

フラグ付き拡張ポイントは、DSL 定義内の場所で、カスタム メソッドを指定することを示すプロパティまたはチェック ボックスを設定できます。 カスタム コンストラクターは 1 つの例です。 その他の例としては、ドメイン プロパティの Kind を Calculated または Custom Storage に設定したり、接続ビルダーで Is Custom フラグを設定したりできます。

いずれの場合も、フラグを設定してコードを再生成すると、ビルド エラーが発生します。 エラーをダブルクリックすると、指定する必要があることを説明するコメントが表示されます。

準則

トランザクション マネージャーを使用すると、プロパティの変更など、指定されたイベントが発生したトランザクションの終了前に実行されるルールを定義できます。 通常、ルールはストア内のさまざまな要素間の同期を維持するために使用されます。 たとえば、ルールを使用して、ダイアグラムにモデルの現在の状態が表示されるようにします。

ルールはクラスごとに定義されるため、各オブジェクトのルールを登録するコードを持つ必要はありません。 詳細については、「ルールによって モデル内に変更が反映される」を参照してください。

イベントを格納する

モデリング ストアには、要素の追加と削除、プロパティ値の変更など、ストア内の特定の種類の変更をリッスンするために使用できるイベント メカニズムが用意されています。 イベント ハンドラーは、変更が行われたトランザクションが終了した後に呼び出されます。 通常、これらのイベントはストア外のリソースを更新するために使用されます。

.NET イベント

図形の一部のイベントをサブスクライブできます。 たとえば、図形のマウスクリックを監視できます。 各オブジェクトのイベントをサブスクライブするコードを記述する必要があります。 このコードは InitializeInstanceResources() のオーバーライドで記述できます。

一部のイベントは、図形にデコレーターを描画するために使用される ShapeFields で生成されます。 例については、「 方法: 図形またはデコレーターのクリックをインターセプトする」を参照してください。

通常、これらのイベントはトランザクション内では発生しません。 ストアで変更を加える場合は、トランザクションを作成する必要があります。