迎撃機
インターセプターはDataverse操作の前後でカスタムサーバーサイドロジックを実行することができます。 ITableRecordInterceptor インターフェースを実装することで、レコード作成、更新、削除、関連付け、分離のライフサイクルにフックをつけることができます。
概要
迎撃機の一般的なユースケースには以下があります:
- レコード作成前にデフォルトフィールド値を設定すること(例:所有者の割り当て)
- データを永続化する前に検証または変換すること
- 現場レベルの検証を超えたビジネスルールの強制
- 記録の作成、更新、削除後の監査ログ
- 通知の送信や関連記録の更新などの副作用を引き起こす
注記
インターセプターは サーバー 上で動作し、すべてのテーブルの操作に適用されます。
TableRecord.TableNameプロパティを使ってロジックを特定のテーブルにフィルタリングします。
はじめに
1. インターセプターの作成
ITableRecordInterceptorを実装し、各メソッドに実装を提供するクラスを作成しましょう。不要なフックは返品Task.CompletedTask。
public class MyInterceptor : ITableRecordInterceptor
{
public Task OnBeforeCreateAsync(TableRecord record)
{
if (record.TableName == "contact")
{
// レコード作成前にデフォルト値を設定します
record.Properties["statuscode"] = new ChoiceValue(1);
}
return Task.CompletedTask;
}
public Task OnAfterCreateAsync(TableRecord record) => Task.CompletedTask;
public Task OnBeforeUpdateAsync(TableRecord record) => Task.CompletedTask;
public Task OnAfterUpdateAsync(TableRecord record) => Task.CompletedTask;
public Task OnBeforeDeleteAsync(TableRecordReference record) => Task.CompletedTask;
public Task OnAfterDeleteAsync(TableRecordReference record) => Task.CompletedTask;
public Task OnBeforeAssociateAsync(TableRecord record) => Task.CompletedTask;
public Task OnAfterAssociateAsync(TableRecord record) => Task.CompletedTask;
public Task OnBeforeDisassociateAsync(TableRecord record) => Task.CompletedTask;
public Task OnAfterDisassociateAsync(TableRecord record) => Task.CompletedTask;
}
2. 依存注入におけるレジスタ
プロジェクトの Program.cs ファイル内のDIコンテナにインターセプターを登録してください:
builder.Services.AddTransient<ITableRecordInterceptor, MyInterceptor>();
インターセプターはDIコンテナから解決されるため、必要なサービスはコンストラクタ注入で注入できます。
ライフサイクルフック
インターフェースは5種類の操作に対するビフォーフックとアフターフックを提供します:
作成
OnBeforeCreateAsync そして OnAfterCreateAsync 新しい記録を作り回る。ビフォーフックはデフォルト値の設定や必要項目の検証に最適です。
public async Task OnBeforeCreateAsync(TableRecord record)
{
if (record.TableName == "contact")
{
// 現在のユーザーを所有連絡先に割り当ててください
var authState = await _authStateProvider.GetAuthenticationStateAsync();
var userId = authState.User.GetUserId();
if (userId != null)
{
record.Properties["ppp_owningportaluserid"] = new LookupValue
{
TableName = "contact",
Value = userId.Value
};
}
}
}
アップデート
OnBeforeUpdateAsync 記録の更新を回 OnAfterUpdateAsync 。ビフォーフックを使って、ビジネスルールを強制したり、値を永続化する前に修正したりしましょう。
削除
OnBeforeDeleteAsyncそしてOnAfterDeleteAsync記録削除を回避しています。これらのフックは完全なTableRecordではなく、TableRecordReference(テーブル名とID)を受け取ることに注意してください。
アソシエイトとディスアソシエイト
OnBeforeAssociateAsync/ 多対多の関係が作られたり削除されたりしたときにOnAfterDisassociateAsync OnAfterAssociateAsyncとOnBeforeDisassociateAsync / が実行されます。
注入サービス
インターセプターはDIコンテナに登録されるため、コンストラクタ注入を通じてサービスを注入できます。これは認証状態、ログ記録、その他のアプリケーションサービスへのアクセスに役立ちます。
internal class SetOwnerInterceptor(
AuthenticationStateProvider authStateProvider) : ITableRecordInterceptor
{
public async Task OnBeforeCreateAsync(TableRecord record)
{
var authState = await authStateProvider.GetAuthenticationStateAsync();
// authStateを使って所有者フィールドを設定します...
}
// ...その他のメソッドはTask.CompletedTaskを返します
}
API参照
ITableRecordInterceptor Interface
方法
名称 | パラメータ | 種類 | 概要 |
|---|---|---|---|
OnAfterAssociateAsync | TableRecord record | Task | 記録が関連付けられた後に呼び出される また多対多の関係によるレコード。関連する集約の更新に役立ちます。 ドメインイベントの発行、または参照整合性の維持。 |
OnAfterCreateAsync | TableRecord record | Task | 新しい記録が作成されるとすぐに発動されます。 ログ作成や通知などの後作成アクションにこれを使います。 または下流のワークフローをトリガーする。 |
OnAfterDeleteAsync | TableRecordReference record | Task | 記録が削除された後に発動されます。 クリーンアップ作業、監査ログ、ドメインイベントの連鎖処理に役立ちます。 |
OnAfterDisassociateAsync | TableRecord record | Task | 記録が から切り離された後に呼び出される また一つの記録。整理や集約データの更新に役立ちます。 またはフォローアッププロセスを引き起こすこともあります。 |
OnAfterUpdateAsync | TableRecord record | Task | 既存の記録が更新された後に呼び出します。 監査ログ、キャッシュ無効化、またはトリガーに有用です フォローアップのプロセス。 |
OnBeforeAssociateAsync | TableRecord record | Task | レコードが他のレコードに関連付けられる前に呼び出しられます 多対多の関係で記録する。これを使って協会を正当化し、強制する 関係ルール、または無効なリンクの防止。 |
OnBeforeCreateAsync | TableRecord record | Task | 新しい記録が作成される直前に呼び出します。 これを用いて、永続化前にレコードを検証、変異、または準備します。 |
OnBeforeDeleteAsync | TableRecordReference record | Task | レコードが削除される前に呼び出します。 これを使って削除ルールを強制したり、ソフトデリット変換を実行したりします。 または特定の条件下でのブロック削除。 |
OnBeforeDisassociateAsync | TableRecord record | Task | レコードが他のレコードから切り離される前に呼び出しられます 記録。これを使い、解離を正当化し、強制する 制約、または必要な関係のブロック除去。 |
OnBeforeUpdateAsync | TableRecord record | Task | 既存のレコードが更新される前に呼び出しられます。 これを使って変更の検証、ビジネスルールの強制、または修正に使います 更新前のレコードが永続化されます。 |
OnAfterAssociateAsyncOnAfterCreateAsyncOnAfterDeleteAsyncOnAfterDisassociateAsyncOnAfterUpdateAsyncOnBeforeAssociateAsyncOnBeforeCreateAsyncOnBeforeDeleteAsyncOnBeforeDisassociateAsyncOnBeforeUpdateAsync