【发布时间】:2021-12-31 20:55:27
【问题描述】:
在命令处理程序上,我想设置事务处理。我不想在所有方法上设置事务,因为它存在性能泄漏。本质上,我想设置这个属性来检查是否应该设置事务。 目前,我可以访问请求属性,但我想访问 handler 属性。
[SqlTransactionAttribute] 只是一个简单的标记属性
[SqlTransactionAttribute]
public class LoginUserCommandHandler : IRequestHandler<LoginUserCommand, TokenDTO>
{
//Command handler implementation
}
现在的问题是在流水线行为中如何判断一个handler是否有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),但是,我更喜欢从处理程序中读取它,因为逻辑必须在处理程序中,并且它更具可读性。
【问题讨论】: