文章插图
7、IPipelineBehavior这个接口的作用就是在我们命令处理之前或者之后插入逻辑 , 类似我们的中间件,我新建一个TransactionBehavior来处理保存数据库之前之后的操作,这里的代码只判断了是否为空之前写的是判断事务是否为空,代码多就随便写了意思意思 。
然后新建一个DBTransactionBehavior这里对操作数据库新增演示一下
using MediatR;using Microsoft.EntityFrameworkCore;using Microsoft.EntityFrameworkCore.Metadata.Internal;namespace MediatApi.Helper{ public class TransactionBehavior<TDBContext, TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse> where TRequest : IRequest<TResponse> where TDBContext : WyyDbContext { ILogger _logger; WyyDbContext _dbContext; public TransactionBehavior(ILogger logger, WyyDbContext dbContext) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _dbContext = dbContext ?? throw new ArgumentNullException(nameof(dbContext)); } public async Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TResponse> next, CancellationToken cancellationToken) { var response = default(TResponse); try { Console.WriteLine("执行前逻辑++++++++++++++++++++++++++++++++++"); Console.WriteLine(); if (request != null) return await next(); Console.WriteLine("逻辑不对处理++++++++++++++++++++++++++++++++"); Console.WriteLine(); var strategy = _dbContext.Database.CreateExecutionStrategy(); await strategy.ExecuteAsync(async () => { Guid transactionId; using (var transaction = await _dbContext.Database.BeginTransactionAsync()) using (_logger.BeginScope("TransactionContext:{TransactionId}", transaction.TransactionId)) { _logger.LogInformation("----- 开始事务 {TransactionId} 请求{request}", transaction.TransactionId, request); response = await next(); _logger.LogInformation("----- 提交事务 {TransactionId}}", transaction.TransactionId); await _dbContext.CommitTransactionAsync(transaction); transactionId = transaction.TransactionId; } }); return response; } catch(Exception ex) { _logger.LogError(ex, "处理事务出错{@Command}", request); throw; } } }}
推荐阅读
- 常用Python库整理
- 加拿大高中排名 加拿大高中排名
- 定位java程序中占用cpu最高的线程堆栈信息
- jk罗琳中文官网 jk罗琳
- PE管十大品牌有哪些 中国pe管道十大品牌
- SpringCloudAlibaba 微服务组件 Nacos 之配置中心源码深度解析
- 幻塔大眼萌仔怎么获取
- 《正义联盟》中超人是怎么死的
- 正义联盟中超人什么时候死的(正义联盟死去的英雄)
- 王者荣耀娜可露露前尘镜中文语音包怎么设置