モデル編集時の逐次検証
概要
Next Design エクステンションで、モデル操作やファイル操作などをイベントとして受け取って、そのイベントごとに独自の処理を実現するチュートリアルです。
前のチュートリアル: モデルの一括検証 で作成したエクステンションをベースに、モデル編集操作に 合わせてモデルを逐次検証するように機能拡張してみましょう。
全体の流れ
- マニフェストによるイベントの拡張ポイント定義
- 逐次検証処理の実装
公開サンプル
-
本チュートリアルの結果として作成されるソースコード一式を GitHub で公開しています。
外部リンク: ValidationSample-2
ゴールイメージ
-
Next Design のサンプルプロジェクトから [先進運転システムソフト開発] プロジェクトを開きます。
-
いずれかのモデルを選択してモデルの名前を変更すると、次の検証ルールにしたがってそのモデルが検証されます。検証ルールに抵触すると、その結果がエラーとして表示されます。
検証ルール: モデル名に半角スペース文字が含まていないこと
備考
- [先進運転システムソフト開発] が見当たらない場合は、拡張機能の BasicSamples パッケージ をインストールしてください。
公式の拡張機能のインストールについてはこちらを参照してください。
マニフェストによるイベントの拡張ポイント定義
拡張ポイントを定義するには、マニフェストに追加で次の内容を定義します。
- イベントの拡張ポイント定義
実装例
モデルの名前はモデルが持つフィールドの一種です。そのため、名前の変更はモデルのフィールド変更イベントとして受け取れます。
モデルのフィールド変更イベントを受け取り、イベントハンドラを呼び出すために、マニフェストに次の内容を定義します。
manifest.json
{
// エクステンション定義
// 拡張ポイント定義
"extensionPoints": {
// リボン
"ribbon": {
},
// コマンド
"commands": [
],
// イベント
"events": {
// モデルに関するイベントの拡張ポイントを追加します。
"models": [
{
"class": "*", // 全モデル共通で検証処理を行う場合は、イベントフィルタに "*" を指定、もしくは、この行を省略します。
// 特定クラスだけを対象に検証処理を行う場合は、イベントフィルタに対象クラス名をカンマ区切りで列挙します。
// "class": "TechnicalArchitectureComponentECU,TechnicalArchitectureComponentSensor",
"onFieldChanged": "OnFieldChanged" // モデルのフィールド変更時のイベントハンドラとして、エントリーポイントのメインクラスに実装される公開メソッドを登録します。
}
]
}
}
}
注記
- 実装例は、モデルの一括検証からの機能拡張部分に着目して記載しています。そのため、実装例単体では動作しない点にご留意ください。
逐次検証処理の実装
モデルのフィールド変更時に逐次検証の処理を実装するには、クラスに追加で次の内容を実装します。
- 検証処理のイベントハンドラ(公開メソッド)
実装例
イベントから呼び出されたイベントハンドラで、イベントの詳細を確認して名前検証処理を呼び出すには、次の内容を公開メソッドとして実装します。
ValidationSample.cs
// エクステンション開発 で参照するAPIの名前空間の宣言
using NextDesign.Extension;
using NextDesign.Core;
using NextDesign.Desktop;
/// <summary>
/// エントリーポイントとなるDLLのメインクラス
/// </summary>
/// <remarks>
/// エントリーポイントのメインクラスには、 `IExtension` インタフェースを実装します。
/// ハンドラはこのクラスの公開メソッドとして実装します。
/// </remarks>
public class ValidationSample : IExtension
{
/// <summary>
/// モデルのフィールド変更のイベントハンドラ
/// </summary>
/// <param name="context">イベントコンテキスト</param>
/// <param name="eventParams">イベントパラメータ</param>
/// <remarks>
/// モデルのフィールド変更イベントハンドラをメインクラスの公開メソッドとして実装します。
/// </remarks>
public void OnFieldChanged(IEventContext context, IEventParams eventParams)
{
// フィールド変更されたモデルやフィール名などの詳細情報は、イベントハンドラの第2引数に渡されるイベントパラメータの中から取得します。
// イベントパラメータの具体的な型はイベントの種類に応じて異なるため、モデルのフィールド変更イベント用のイベントパラメータに型変換します。
var fieldChangeParams = eventParams as ModelFieldChangedEventParams;
var model = fieldChangeParams.Model; // フィールド変更されたモデル
var fieldName = fieldChangeParams.Field; // フィールド変更されたフィールド名
var app = context.App;
// 変更されたフィールドが `Name` フィールドの場合のみ検証します。
if (fieldName == "Name")
{
// 対象モデルに対する以前のエラーをクリアします。
app.Errors.ClearErrorsAt(model);
// 検証ルールに従ってモデルを検証します。
ValidateModel(model);
}
}
}
注記
- 実装例は、モデルの一括検証からの機能拡張部分に着目して記載しています。そのため、実装例単体では動作しない点にご留意ください。