.net core 实例教程(八)事务提交配置、TransactionScope使用
本文源码下载地址:http://www.80cxy.com/Blog/ResourceView?arId=202403191532545995NAAqJh
系列教程地址:http://www.80cxy.com/Blog/ArticleView?arId=202403191517574161ay3s5V
.net core 实例教程(三)仓储及领域服务功能实现(既实现用户表的增删改查接口)文章中讲解了数据库增删改查基本操作,数据库保存是在仓储代码中实现的。也没使用事务提交。本文讲解利用IAsyncActionFilter过滤器统计进行事务提交配置。
public async Task<SysUser> AddUser(string userName, string password, string realName, string userType)
{
SysUser model = SysUser.Add(userName, password, realName, userType);
await _dbContext.SysUser.AddAsync(model);
await _dbContext.SaveChangesAsync();
return model;
}
一、UnitOfWorkFilter实现代码
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using System.Reflection;
using System.Transactions;
namespace SignUp.Common.ASPNETCore
{
public class UnitOfWorkFilter : IAsyncActionFilter
{
private static UnitOfWorkAttribute? GetUoWAttr(ActionDescriptor actionDesc)
{
var caDesc = actionDesc as ControllerActionDescriptor;
if (caDesc == null)
{
return null;
}
//try to get UnitOfWorkAttribute from controller,
//if there is no UnitOfWorkAttribute on controller,
//try to get UnitOfWorkAttribute from action
var uowAttr = caDesc.ControllerTypeInfo
.GetCustomAttribute<UnitOfWorkAttribute>();
//方法标注UnitOfWorkAttribute,进行事务控制
if (uowAttr != null)
{
return uowAttr;
}
else
{
return caDesc.MethodInfo
.GetCustomAttribute<UnitOfWorkAttribute>();
}
}
public async Task OnActionExecutionAsync(ActionExecutingContext context,
ActionExecutionDelegate next)
{
var uowAttr = GetUoWAttr(context.ActionDescriptor);
if (uowAttr == null)
{
await next();
return;
}
using TransactionScope txScope = new(TransactionScopeAsyncFlowOption.Enabled);
List<DbContext> dbCtxs = new List<DbContext>();
foreach (var dbCtxType in uowAttr.DbContextTypes)
{
//用HttpContext的RequestServices
//确保获取的是和请求相关的Scope实例
var sp = context.HttpContext.RequestServices;
DbContext dbCtx = (DbContext)sp.GetRequiredService(dbCtxType);
dbCtxs.Add(dbCtx);
}
var result = await next();
if (result.Exception == null)
{
foreach (var dbCtx in dbCtxs)
{
await dbCtx.SaveChangesAsync();
}
txScope.Complete();
}
}
}
}
using Microsoft.EntityFrameworkCore;
namespace SignUp.Common.ASPNETCore
{
[AttributeUsage(AttributeTargets.Class
| AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class UnitOfWorkAttribute : Attribute
{
public Type[] DbContextTypes { get; init; }
public UnitOfWorkAttribute(params Type[] dbContextTypes)
{
this.DbContextTypes = dbContextTypes;
foreach (var type in dbContextTypes)
{
if (!typeof(DbContext).IsAssignableFrom(type))
{
throw new ArgumentException($"{type} must inherit from DbContext");
}
}
}
}
}
二、使用方法
在需要事务提交的控制器或action上使用[UnitOfWork(typeof(SignUpDbContext))]特性即可。然后将仓储保存代码删除。
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using SignUp.Common.ASPNETCore;
using SignUp.Domain.Service;
using SignUp.Infrastructure;
using SignUp.WebApi.ViewModels;
using SignUp.WebApi.ViewModels.System;
namespace SignUp.WebApi.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class SystemController : ControllerBase
{
private readonly ISystemDomainService _systemDomainService;
public SystemController(ISystemDomainService systemDomainService)
{
_systemDomainService = systemDomainService;
}
#region 用户管理
[HttpPost]
public async Task<ActionResult> GetUserList(PageGridRequest req)
{
return new JsonResult(await _systemDomainService.GetUserList(req.PageIndex, req.PageSize, req.Wheres, req.Sort, req.Order));
}
/// <summary>
/// 添加菜单
/// </summary>
/// <remarks>
/// 描述:添加菜单
/// </remarks>
/// <param name="req"></param>
/// <returns></returns>
[HttpPost]
[UnitOfWork(typeof(SignUpDbContext))]
public async Task<ActionResult> AddUser(AddUserRequest req)
{
return new JsonResult(await _systemDomainService.AddUser(req.UserName, req.Password, req.RealName, req.UserType));
}
/// <summary>
/// 修改菜单
/// </summary>
/// <remarks>
/// 描述:修改菜单
/// </remarks>
/// <param name="req"></param>
/// <returns></returns>
[HttpPut]
[UnitOfWork(typeof(SignUpDbContext))]
public async Task<ActionResult> EditUser(EditUserRequest req)
{
return new JsonResult(await _systemDomainService.EditUser(req.Id, req.UserName, req.RealName, req.UserType));
}
/// <summary>
/// 删除人员
/// </summary>
/// <remarks>
/// 描述:删除人员
/// </remarks>
/// <param name="id"></param>
/// <returns></returns>
[HttpDelete]
[UnitOfWork(typeof(SignUpDbContext))]
public async Task<ActionResult> DeleteUser(string id)
{
return new JsonResult(await _systemDomainService.DeleteUser(id));
}
/// <summary>
/// 删除人员
/// </summary>
/// <remarks>
/// 描述:删除人员
/// </remarks>
/// <param name="ids"></param>
/// <returns></returns>
[HttpDelete]
[UnitOfWork(typeof(SignUpDbContext))]
public ActionResult DeleteUserRange(string[] ids)
{
return new JsonResult(_systemDomainService.DeleteUserRange(ids));
}
#endregion
}
}
删除仓储保存代码
public async Task<SysUser> AddUser(string userName, string password, string realName, string userType)
{
SysUser model = SysUser.Add(userName, password, realName, userType);
await _dbContext.SysUser.AddAsync(model);
return model;
}
学习交流

附笔者学习 .net core开发时参考相关项目实例源码:asp.net core webapi项目实例源代码锦集下载(72个)
猜您可能还喜欢
- .Nuget Packages 太占C盘,删除后可以放到其他盘(1619)
- net core+webapi+nginx windows 服务器部署(1484)
- ASP.NET Core 配置 Swagger 显示接口注释描述信息(1225)
- vue调用接口后获取不到后端返回的Header响应头(1174)
- .net core 6.0 web API + SwaggerUI + IIS部署(1167)
- .net core 系列实例开发教程-权限管理系统功能介绍(1097)
- .net core 实例教程(十二)配置启用Swagger中的【Authorize】按钮(1065)
- .net core 实例教程(十一)生成JWT格式的token密码配置及代码(993)
- .net core 实例教程(十四)配置 Swagger 显示接口注释描述信息及支持版本控制(949)
- .net core 实例教程(三)仓储及领域服务功能实现(既实现用户表的增删改查接口)(930)
评论列表
发表评论
文章分类
文章归档
- 2025年3月 (1)
- 2024年6月 (2)
- 2024年5月 (2)
- 2024年4月 (4)
- 2024年3月 (30)
- 2024年1月 (4)
- 2023年12月 (2)
- 2023年11月 (4)
- 2023年10月 (4)
- 2023年9月 (6)
- 2023年3月 (2)
- 2023年2月 (1)
- 2023年1月 (1)
- 2022年12月 (1)
- 2022年9月 (21)
- 2022年8月 (10)
- 2022年7月 (3)
- 2022年4月 (1)
- 2022年3月 (13)
- 2021年8月 (1)
- 2021年3月 (1)
- 2020年12月 (42)
- 2020年11月 (7)
- 2020年10月 (5)
- 2020年8月 (1)
- 2020年6月 (1)
- 2020年3月 (2)
- 2019年12月 (8)
- 2019年11月 (3)
- 2019年9月 (1)
- 2019年4月 (1)
- 2019年3月 (6)
- 2019年2月 (1)
- 2018年7月 (7)
阅读排行
- 1.asp.net mvc内微信pc端、H5、JsApi支付方式总结(5871)
- 2.Windows 10休眠文件更改存储位置(3799)
- 3.各大搜索网站网站收录提交入口地址(3476)
- 4.ECharts仪表盘实例及参数使用详解(3424)
- 5.windows 10安装myeclipse 10破解补丁cracker.jar、run.bat闪退解决办法(3417)
- 6.HTML5 WebSocket与C#建立Socket连接实现代码(3171)
- 7.华为鸿蒙系统清除微信浏览器缓存方法(3154)
- 8.CERT_HAS_EXPIRED错误如何解决(2955)
- 9.Js异步async、await关键字详细介绍(lambda表达式中使用async和await关键字)(2591)
- 10.HBuilder编辑器格式化代码(2385)
