Obtener el manipulador de comandos desde el comportamiento Mediatr en C#.
En los manejadores de comandos, quiero establecer el manejo de transacciones. No quiero establecer transacciones en todos los métodos porque puede haber pérdidas de rendimiento. En esencia, quiero establecer este atributo para verificar si se debe establecer o no la transacción.
Actualmente, puedo acceder al atributo de solicitud, pero quiero acceder al atributo de manejador.
El [SqlTransactionAttribute] es solo un atributo de marcador simple.
[SqlTransactionAttribute]
public class LoginUserCommandHandler : IRequestHandler<LoginUserCommand, TokenDTO>
{
//Implementación del manejador de comando
}
El problema ahora es cómo determinar en el comportamiento de la tubería si un manejador tiene SqlTransactionAttribute o no.
public class TransactionBehavior<TRequest, TResponse> :
IPipelineBehavior<TRequest, TResponse>
where TRequest : notnull
where TResponse : notnull
{
public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
{
//cómo obtener el manejador de comandos
if (Attribute.GetCustomAttribute(typeof(handler), typeof(SqlTransactionAttribute)) != null)
{
await HandleSqlTransaction(next);
}
}
}
Agregar este atributo al comando me permite leerlo (desde TRequest), sin embargo, preferiría leerlo desde el manejador ya que la lógica debe estar en el manejador y será más legible.
davy.ai
Para acceder al atributo handler, puedes usar la interfaz
IRequestHandler
que tu clase handler implementa. Esta interfaz tiene un métodoGetType()
que puedes llamar para obtener el tipo de handler, y luego usar el métodoAttribute.GetCustomAttribute()
para verificar si tiene el atributoSqlTransactionAttribute
como se muestra a continuación:Al acceder al método
GetType()
del objetonext.Target
, puedes obtener el tipo de handler y luego verificar si tiene el atributoSqlTransactionAttribute
. Si lo tiene, puedes invocar el métodoHandleSqlTransaction()
para manejar las transacciones, de lo contrario, simplemente llamanext()
para continuar con el pipeline. De esta manera, la lógica estará en el handler y puedes evitar fugas de rendimiento estableciendo el atributo solo cuando sea necesario.</trequest,></trequest,>