从C#中的Mediator Behavior获取命令处理程序



在命令处理程序中,我想设置事务处理。我不想在所有方法上设置事务,因为它存在性能泄漏。本质上,我想设置这个属性来检查是否应该设置事务。目前,我可以访问请求属性,但我希望访问处理程序属性

[SqlTransactionAttribute]只是一个简单的标记属性

[SqlTransactionAttribute]
public class LoginUserCommandHandler : IRequestHandler<LoginUserCommand, TokenDTO>
{
//Command handler implementation
}

现在的问题是,在管道行为中,如何确定处理程序是否具有SqlTransactionAttribute

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)
{
//how to get command handler 
if (Attribute.GetCustomAttribute(typeof(handler), typeof(SqlTransactionAttribute)) != null)
{
await HandleSqlTransaction(next);
}
}
}

将这个属性添加到命令中可以让我读取它(从TRequest(,但是,我更喜欢从处理程序中读取它,因为逻辑必须在处理程序中,它将更可读。

将RequestHandler注入构造函数。

public class TransactionBehavior<TRequest, TResponse> :
IPipelineBehavior<TRequest, TResponse>
where TRequest : IRequest<TResponse>
where TResponse : notnull
{
private readonly IRequestHandler<TRequest, TResponse> requestHandler;
public TransactionBehavior(IRequestHandler<TRequest, TResponse> requestHandler)
{
this.requestHandler = requestHandler;
}
public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
{
var hasSqlTransactionAttribute = requestHandler.GetType().GetCustomAttributes<SqlTransactionAttribute>().Any();
if (hasSqlTransactionAttribute)
{
await HandleSqlTransaction(next);
}
}
}

我试过了,它可以

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 hasTransactionAttribute = typeof(TRequest).GetCustomAttributes(typeof(SqlTransactionAttribute), false).Any();
//how to get command handler 
if (hasTransactionAttribute)
{
await HandleSqlTransaction(next);
}
}
}

最新更新