Abfangjäger
Interceptoren ermöglichen es, benutzerdefinierte serverseitige Logik vor und nach Dataverse-Operationen auszuführen. Durch die Implementierung der Schnittstelle ITableRecordInterceptor können Sie sich in den Lebenszyklus der Datensatzerstellung, Aktualisierungen, Löschungen, Assoziationen und Disoziationen einbinden.
Überblick
Häufige Anwendungsfälle für Abfangjäger sind:
- Einstellung von Standardfeldwerten vor der Erstellung eines Datensatzes (z. B. Zuweisung eines Eigentümers)
- Validierung oder Transformation von Daten, bevor sie gespeichert werden
- Durchsetzung von Geschäftsregeln, die über die Validierung auf Feldebene hinausgehen
- Audit-Logging nach der Erstellung, Aktualisierung oder Löschung von Datensätzen
- Auslösen von Nebenwirkungen wie das Senden von Benachrichtigungen oder das Aktualisieren verwandter Datensätze
Anmerkung
Interceptoren laufen auf dem Server und werden auf alle Operationen für alle Tabellen angewendet. Verwenden Sie die Eigenschaft
TableRecord.TableName, um die Logik auf bestimmte Tabellen zu filtern.
Anfang
1. Einen Abfangfanger erstellen
Erstelle eine Klasse, die implementiert ITableRecordInterceptor und implementiert für jede Methode. Gib alle Haken zurück, Task.CompletedTask die du nicht brauchst.
public class MyInterceptor : ITableRecordInterceptor
{
public Task OnBeforeCreateAsync(TableRecord record)
{
if (record.TableName == "contact")
{
// Setze einen Standardwert, bevor der Datensatz erstellt wird
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. Registrieren in der Abhängigkeitsinjektion
Registrieren Sie Ihren Abfanggerät im DI-Container in der Program.cs Datei Ihres Projekts:
builder.Services.AddTransient<ITableRecordInterceptor, MyInterceptor>();
Da Interceptoren aus dem DI-Container aufgelöst werden, kannst du alle erforderlichen Dienste per Konstruktor-Injektion injizieren.
Lebenszyklus-Hooks
Die Schnittstelle bietet Vorher-Nachher-Haken für fünf Arten von Operationen:
Erstellen Sie
OnBeforeCreateAsync und herumlaufen mit OnAfterCreateAsync neuer Plattenerstellung. Der Vorher-Hook ist ideal, um Standardwerte festzulegen oder erforderliche Felder zu validieren.
public async Task OnBeforeCreateAsync(TableRecord record)
{
if (record.TableName == "contact")
{
// Weisen Sie den aktuellen Nutzer als besitzenden Kontakt zu
var authState = await _authStateProvider.GetAuthenticationStateAsync();
var userId = authState.User.GetUserId();
if (userId != null)
{
record.Properties["ppp_owningportaluserid"] = new LookupValue
{
TableName = "contact",
Value = userId.Value
};
}
}
}
Update
OnBeforeUpdateAsync Und herumlaufen und OnAfterUpdateAsync Updates aufzeichnen. Verwenden Sie den Vorher-Hook, um Geschäftsregeln zu erzwingen oder Werte zu ändern, bevor sie gespeichert werden.
Löschen
OnBeforeDeleteAsyncOnAfterDeleteAsync und die Löschung von Datensätzen umgehen. Beachten Sie, dass diese Hooks eine TableRecordReference (Tabellenname und -ID) erhalten statt eines vollständigen TableRecord.
Associate & Dissociation
OnBeforeAssociateAsync / OnAfterAssociateAsync und OnBeforeDisassociateAsync / OnAfterDisassociateAsync laufen, wenn viele-zu-viele-Beziehungen geschaffen oder entfernt werden.
Injektionsdienste
Da Interceptoren im DI-Container registriert sind, kannst du Dienste über Konstruktor-Injektion injizieren. Dies ist nützlich, um auf Authentifizierungsstatus, Protokollierung oder andere Anwendungsdienste zuzugreifen.
internal class SetOwnerInterceptor(
AuthenticationStateProvider authStateProvider) : ITableRecordInterceptor
{
public async Task OnBeforeCreateAsync(TableRecord record)
{
var authState = await authStateProvider.GetAuthenticationStateAsync();
// Verwenden Sie AuthState, um Eigentümerfelder einzustellen...
}
// ... andere Methoden geben Task.CompletedTask zurück.
}
API-Referenz
ITableRecordInterceptor Interface
Methoden
Name | Parameter | Typ | Beschreibung |
|---|---|---|---|
OnAfterAssociateAsync | TableRecord record | Task | Berufen, nachdem ein Datensatz zugeordnet wurde mit ein weiterer Rekord durch eine viele-zu-viele-Beziehung. Nützlich zur Aktualisierung verwandter Aggregate, Domänenereignisse aussenden oder die referenzielle Integrität aufrechterhalten. |
OnAfterCreateAsync | TableRecord record | Task | Sofort nach der Erstellung eines neuen Datensatzes aktiviert. Verwenden Sie dies für Nachbearbeitungsmaßnahmen wie Protokollierung, Benachrichtigungen, Oder es löst nachgelagerte Arbeitsabläufe aus. |
OnAfterDeleteAsync | TableRecordReference record | Task | Wird aufgerufen, nachdem ein Datensatz gelöscht wurde. Nützlich für Bereinigungsaufgaben, Audit-Logging oder Kaskaden-Domain-Events. |
OnAfterDisassociateAsync | TableRecord record | Task | Berufen, nachdem ein Datensatz getrennt wurde Noch ein Rekord. Nützlich für Aufräumen, Aktualisierung von Aggregaten, oder Folgeprozesse auslösen. |
OnAfterUpdateAsync | TableRecord record | Task | Wird aufgerufen, nachdem ein bestehender Datensatz aktualisiert wurde. Nützlich für Audit-Logging, Cache-Invalidierung oder Auslösung Nachverfolgungsprozesse. |
OnBeforeAssociateAsync | TableRecord record | Task | Aufgerufen, bevor ein Datensatz mit einem anderen verknüpft wird Zeichnen Sie über eine viele-zu-viele-Beziehung auf. Nutzen Sie dies, um die Verbindung zu validieren, durchzusetzen Beziehungsregeln oder ungültige Links verhindern. |
OnBeforeCreateAsync | TableRecord record | Task | Wird unmittelbar vor der Erstellung eines neuen Datensatzes aufgerufen. Nutzen Sie dies, um den Datensatz vor dem Persistenz zu validieren, zu mutieren oder vorzubereiten. |
OnBeforeDeleteAsync | TableRecordReference record | Task | Wird aufgerufen, bevor ein Datensatz gelöscht wird. Nutzen Sie dies, um Löschregeln durchzusetzen, Soft-Delete-Konvertierungen durchzuführen, oder Blocklöschung unter bestimmten Bedingungen. |
OnBeforeDisassociateAsync | TableRecord record | Task | Aufgerufen, bevor ein Datensatz von einem anderen getrennt wird Aufzeichnung. Nutze das, um die Dissoziation zu validieren, durchzusetzen Einschränkungen oder blockieren die Entfernung erforderlicher Beziehungen. |
OnBeforeUpdateAsync | TableRecord record | Task | Wird aufgerufen, bevor ein bestehender Datensatz aktualisiert wird. Nutzen Sie dies, um Änderungen zu validieren, Geschäftsregeln durchzusetzen oder zu modifizieren der Datensatz vor dem Update wurde aufrechterhalten. |
OnAfterAssociateAsyncOnAfterCreateAsyncOnAfterDeleteAsyncOnAfterDisassociateAsyncOnAfterUpdateAsyncOnBeforeAssociateAsyncOnBeforeCreateAsyncOnBeforeDeleteAsyncOnBeforeDisassociateAsyncOnBeforeUpdateAsync