Interceptadores
Interceptores permitem que você execute lógica personalizada do lado do servidor antes e depois das operações do Dataverse. Ao implementar a ITableRecordInterceptor interface, você pode se conectar ao ciclo de vida da criação de registros, atualizações, exclusões, associações e dissociações.
Visão geral
Casos de uso comuns para interceptadores incluem:
- Definir valores padrão de campo antes de um registro ser criado (por exemplo, atribuir um proprietário)
- Validação ou transformação de dados antes que sejam persistidos
- Aplicando regras de negócios que vão além da validação em nível de campo
- Registro de auditoria após a criação, atualização ou exclusão de registros
- Efeitos colaterais desencadeadores, como enviar notificações ou atualizar registros relacionados
Nota
Interceptadores rodam no servidor e se aplicam a todas as operações de todas as tabelas. Use a
TableRecord.TableNamepropriedade para filtrar a lógica para tabelas específicas.
Começando
1. Criar um Interceptor
Crie uma classe que implemente ITableRecordInterceptor e forneça implementações para cada método. Devolva Task.CompletedTask qualquer gancho, que não precisar.
public class MyInterceptor : ITableRecordInterceptor
{
public Task OnBeforeCreateAsync(TableRecord record)
{
if (record.TableName == "contact")
{
// Defina um valor padrão antes da criação do registro
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. Registro na Injeção de Dependência
Registre seu interceptador no contêiner DI no arquivo do Program.cs seu projeto:
builder.Services.AddTransient<ITableRecordInterceptor, MyInterceptor>();
Como interceptores são resolvidos a partir do contêiner DI, você pode injetar quaisquer serviços necessários por meio da injeção do construtor.
Ganchos do Ciclo de Vida
A interface fornece ganchos antes e depois para cinco tipos de operações:
Criar
OnBeforeCreateAsync e OnAfterCreateAsync correr por aí na criação de novos discos. O gancho antes é ideal para definir valores padrão ou validar campos exigidos.
public async Task OnBeforeCreateAsync(TableRecord record)
{
if (record.TableName == "contact")
{
// Atribua o usuário atual como contato proprietário
var authState = await _authStateProvider.GetAuthenticationStateAsync();
var userId = authState.User.GetUserId();
if (userId != null)
{
record.Properties["ppp_owningportaluserid"] = new LookupValue
{
TableName = "contact",
Value = userId.Value
};
}
}
}
Atualização
OnBeforeUpdateAsync e OnAfterUpdateAsync correr ao redor de atualizações de registro. Use o gancho antes para impor regras de negócio ou modificar valores antes que sejam mantidos.
Excluir
OnBeforeDeleteAsynce OnAfterDeleteAsync contornar a exclusão de registros. Note que esses ganchos recebem um TableRecordReference (nome da tabela e ID) em vez de um .TableRecord
Associado e Dissociado
OnBeforeAssociateAsync / OnAfterAssociateAsync e OnBeforeDisassociateAsync / OnAfterDisassociateAsync funcionam quando relacionamentos muitos-para-muitos são criados ou removidos.
Serviços de Injeção
Como interceptores são registrados no contêiner DI, você pode injetar serviços via injeção de construtor. Isso é útil para acessar estados de autenticação, registro ou outros serviços de aplicação.
internal class SetOwnerInterceptor(
AuthenticationStateProvider authStateProvider) : ITableRecordInterceptor
{
public async Task OnBeforeCreateAsync(TableRecord record)
{
var authState = await authStateProvider.GetAuthenticationStateAsync();
// Use o authState para definir campos de proprietário...
}
// ... outros métodos retornam Task.CompletedTask
}
Referência API
ITableRecordInterceptor Interface
Métodos
Nome | Parâmetros | Tipo | Descrição |
|---|---|---|---|
OnAfterAssociateAsync | TableRecord record | Task | Invocado após um registro ter sido associado a outro disco via um relacionamento muitos-para-muitos. Útil para atualizar agregados relacionados, emitindo eventos de domínio, ou mantendo integridade referencial. |
OnAfterCreateAsync | TableRecord record | Task | Invocado imediatamente após a criação de um novo registro. Use isso para ações pós-criação, como logar, notificações, ou desencadear fluxos de trabalho posteriores. |
OnAfterDeleteAsync | TableRecordReference record | Task | Invocado após um registro ser excluído. Útil para tarefas de limpeza, registros de auditoria ou cascata de eventos de domínio. |
OnAfterDisassociateAsync | TableRecord record | Task | Invocado após um registro ter sido dissociado de outro recorde. Útil para limpeza, atualização de agregados, ou desencadear processos de acompanhamento. |
OnAfterUpdateAsync | TableRecord record | Task | Invocado após um registro existente ter sido atualizado. Útil para registro de auditoria, invalidação de cache ou disparo Processos de acompanhamento. |
OnBeforeAssociateAsync | TableRecord record | Task | Invocado antes que um registro seja associado a outro Registro por meio de um relacionamento muitos-para-muitos. Use isso para validar a associação, fazer cumprir regras de relacionamento, ou evitar links inválidos. |
OnBeforeCreateAsync | TableRecord record | Task | Invocado imediatamente antes de um novo registro ser criado. Use isso para validar, mutar ou preparar o registro antes da persistência. |
OnBeforeDeleteAsync | TableRecordReference record | Task | Invocado antes que um registro seja excluído. Use isso para impor regras de exclusão, realizar conversões de deleção suave, ou bloquear a exclusão sob certas condições. |
OnBeforeDisassociateAsync | TableRecord record | Task | Invocado antes que um registro seja dissociado de outro Recorde. Use isso para validar a dissociação, fazer cumprir restrições, ou remoção de bloqueios de relações necessárias. |
OnBeforeUpdateAsync | TableRecord record | Task | Invocado antes que um registro existente seja atualizado. Use isso para validar alterações, aplicar regras de negócio ou modificar o registro antes da atualização ser mantido. |
OnAfterAssociateAsyncOnAfterCreateAsyncOnAfterDeleteAsyncOnAfterDisassociateAsyncOnAfterUpdateAsyncOnBeforeAssociateAsyncOnBeforeCreateAsyncOnBeforeDeleteAsyncOnBeforeDisassociateAsyncOnBeforeUpdateAsync