es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para acceder al atributo handler, puedes usar la interfaz IRequestHandler que tu clase handler implementa. Esta interfaz tiene un método GetType() que puedes llamar para obtener el tipo de handler, y luego usar el método Attribute.GetCustomAttribute() para verificar si tiene el atributo SqlTransactionAttribute como se muestra a continuación:

    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)
        {
            var handlerType = next.Target.GetType(); // obtener el tipo de handler del delegado
            var attr = Attribute.GetCustomAttribute(handlerType, typeof(SqlTransactionAttribute));
            if (attr != null)
            {
                await HandleSqlTransaction(next);
            }
            return await next();
        }
    }
    

    Al acceder al método GetType() del objeto next.Target, puedes obtener el tipo de handler y luego verificar si tiene el atributo SqlTransactionAttribute. Si lo tiene, puedes invocar el método HandleSqlTransaction() para manejar las transacciones, de lo contrario, simplemente llama next() 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,>

Comments are closed.