Intercepteurs
Les intercepteurs permettent d’exécuter une logique côté serveur personnalisée avant et après les opérations Dataverse. En implémentant l’interface ITableRecordInterceptor , vous pouvez vous connecter au cycle de vie de la création d’enregistrements, des mises à jour, suppressions, associations et dissociations.
Aperçu
Les cas d’usage courants des intercepteurs incluent :
- Définir les valeurs de champ par défaut avant la création d’un enregistrement (par exemple, assigner un propriétaire)
- Valider ou transformer les données avant qu’elles ne soient conservées
- Appliquer des règles métier qui vont au-delà de la validation au niveau du terrain
- Audit de la journalisation après la création, la mise à jour ou la suppression des enregistrements
- Effets secondaires déclencheurs tels que l’envoi de notifications ou la mise à jour des dossiers connexes
Note
Les intercepteurs s’exécutent sur le serveur et s’appliquent à toutes les opérations de toutes les tables. Utilisez cette
TableRecord.TableNamepropriété pour filtrer la logique vers des tables spécifiques.
Commencer
1. Créer un intercepteur
Créez une classe qui implémente ITableRecordInterceptor et fournit des implémentations pour chaque méthode. Retournez Task.CompletedTask pour les crochets dont vous n’avez pas besoin.
public class MyInterceptor : ITableRecordInterceptor
{
public Task OnBeforeCreateAsync(TableRecord record)
{
if (record.TableName == "contact")
{
// Définissez une valeur par défaut avant la création de l’enregistrement
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. Enregistrer dans l’injection de dépendance
Enregistrez votre intercepteur dans le conteneur DI du fichier de Program.cs votre projet :
builder.Services.AddTransient<ITableRecordInterceptor, MyInterceptor>();
Puisque les intercepteurs sont résolus à partir du conteneur DI, vous pouvez injecter tous les services nécessaires via l’injection du constructeur.
Crochets du cycle de vie
L’interface fournit des crochets avant et après pour cinq types d’opérations :
Créer
OnBeforeCreateAsync et OnAfterCreateAsync de créer de nouveaux disques en partant. Le crochet avant est idéal pour définir les valeurs par défaut ou valider les champs requis.
public async Task OnBeforeCreateAsync(TableRecord record)
{
if (record.TableName == "contact")
{
// Assignez l’utilisateur actuel comme contact propriétaire
var authState = await _authStateProvider.GetAuthenticationStateAsync();
var userId = authState.User.GetUserId();
if (userId != null)
{
record.Properties["ppp_owningportaluserid"] = new LookupValue
{
TableName = "contact",
Value = userId.Value
};
}
}
}
Mise à jour
OnBeforeUpdateAsync et OnAfterUpdateAsync faire des enregistrements de mises à jour en contournement. Utilisez le crochet avant pour faire respecter les règles métier ou modifier les valeurs avant qu’elles ne soient maintenues.
Supprimer
OnBeforeDeleteAsync et OnAfterDeleteAsync contourner la suppression des enregistrements. Notez que ces crochets reçoivent un TableRecordReference (nom de table et ID) plutôt qu’un fichier complet TableRecord.
Associé et Dissociation
OnBeforeAssociateAsync / OnAfterAssociateAsync et OnBeforeDisassociateAsync / OnAfterDisassociateAsync fonctionnent lorsque des relations de plusieurs-à-plusieurs sont créées ou supprimées.
Services d’injection
Comme les intercepteurs sont enregistrés dans le conteneur DI, vous pouvez injecter des services via injection de constructeur. Cela est utile pour accéder à l’état d’authentification, la journalisation ou d’autres services applicatifs.
internal class SetOwnerInterceptor(
AuthenticationStateProvider authStateProvider) : ITableRecordInterceptor
{
public async Task OnBeforeCreateAsync(TableRecord record)
{
var authState = await authStateProvider.GetAuthenticationStateAsync();
// Utilisez authState pour définir des champs propriétaire...
}
// ... d’autres méthodes retournent Task.CompletedTask
}
Référence API
ITableRecordInterceptor Interface
Méthodes
Nom | Paramètres | Type | Description |
|---|---|---|---|
OnAfterAssociateAsync | TableRecord record | Task | Invoqué après qu’un dossier a été associé à Un autre disque via une relation de nombreux à plusieurs. Utile pour mettre à jour les agrégats associés, émettant des événements de domaine, ou maintenant l’intégrité référentielle. |
OnAfterCreateAsync | TableRecord record | Task | Invoqué immédiatement après la création d’un nouveau dossier. Utilisez-le pour les actions post-création telles que la journalisation, les notifications, ou déclencher des flux de travail en aval. |
OnAfterDeleteAsync | TableRecordReference record | Task | Invoqué après la suppression d’un enregistrement. Utile pour les tâches de nettoyage, la journalisation d’audit ou la cascade d’événements de domaine. |
OnAfterDisassociateAsync | TableRecord record | Task | Invoqué après qu’un enregistrement a été dissocié de un autre record. Utile pour le nettoyage, la mise à jour des agrégats, ou déclencher des processus de suivi. |
OnAfterUpdateAsync | TableRecord record | Task | Invoqué après qu’un enregistrement existant a été mis à jour. Utile pour la journalisation d’audit, l’invalidation du cache ou les déclenchements Processus de suivi. |
OnBeforeAssociateAsync | TableRecord record | Task | Invoqué avant qu’un enregistrement ne soit associé à un autre Enregistrer via une relation de plusieurs à plusieurs. Utilisez cela pour valider l’association, faire respecter règles de relation, ou empêcher les liens invalides. |
OnBeforeCreateAsync | TableRecord record | Task | Invoqué immédiatement avant la création d’un nouveau dossier. Utilisez cela pour valider, muter ou préparer l’enregistrement avant la persistance. |
OnBeforeDeleteAsync | TableRecordReference record | Task | Invoqué avant qu’un enregistrement ne soit supprimé. Utilisez cela pour faire respecter les règles de suppression, effectuer des conversions par suppression douce, ou bloquer la suppression sous certaines conditions. |
OnBeforeDisassociateAsync | TableRecord record | Task | Invoqué avant qu’un enregistrement ne soit dissocié d’un autre Record. Utilisez cela pour valider la dissociation, faire respecter des contraintes, ou la suppression de blocages des relations requises. |
OnBeforeUpdateAsync | TableRecord record | Task | Invoqué avant qu’un enregistrement existant ne soit mis à jour. Utilisez cela pour valider les modifications, faire respecter les règles métier ou modifier le dossier avant la mise à jour a été conservé. |
OnAfterAssociateAsyncOnAfterCreateAsyncOnAfterDeleteAsyncOnAfterDisassociateAsyncOnAfterUpdateAsyncOnBeforeAssociateAsyncOnBeforeCreateAsyncOnBeforeDeleteAsyncOnBeforeDisassociateAsyncOnBeforeUpdateAsync