本篇文章旨在描述如何在 ASP.NET Core项目中并以一种简便的方式启用CAP事务,因为在我们的示例中都是直接演示比较直观的方式,没有进行封装,有些初学者同学不太会,找到问我如何封装,本篇文章主要是一个简单的演示。

在本示例中 ,我们主要是基于 Entity Framework 来进行演示,如果你使用其他 Orm 原理类似,大家参考即可。

发布端事务

由于大部分人都是在 Web 中使用,所以可以通过使用 ASP.NET Core 过滤器的方式进行,当然也可以通过中间件,原理是一致的。

1、创建一个 TypeFilter,命名为 CapTransactionFilterAttribute

public class CapTransactionFilterAttribute : TypeFilterAttribute
{
public CapTransactionFilterAttribute() : base(typeof(TransactionActionFilter))
{ } public class TransactionActionFilter : IActionFilter
{
private IDbContextTransaction _transaction; public void OnActionExecuting(ActionExecutingContext context)
{
var dbContext = context.HttpContext.RequestServices.GetRequiredService<AppDbContext>();
var capPublisher = context.HttpContext.RequestServices.GetService<ICapPublisher>();
_transaction = dbContext.Database.BeginTransaction(capPublisher);
} public void OnActionExecuted(ActionExecutedContext context)
{
if (context.Exception == null)
{
_transaction.Commit();
}
else
{
_transaction.Rollback();
} _transaction?.Dispose();
}
}
}

2、使用方式,在需要进行事务控制的 Action 上添加 [TypeFilter(typeof(CapTransactionFilterAttribute))] 即可生效。

[Route("~/ef/trans-filter")]
[TypeFilter(typeof(CapTransactionFilterAttribute))]
public IActionResult EntityFrameworkWithTransactionFilter(
[FromServices] AppDbContext dbContext)
{
dbContext.Persons.Add(new Person() { Name = "ef.transaction" }); _capBus.Publish("sample.rabbitmq.mysql", DateTime.Now); dbContext.SaveChanges(); return Ok();
}

消费端事务

消费端自动事务主要利用 CAP 提供的过滤器来进行开启,需要 CAP 版本大于 5.1.0。

1、创建一个 CAP 过滤器

public class MyCapFilter : SubscribeFilter
{
private readonly AppDbContext _dbContext;
private IDbContextTransaction _transaction; public MyCapFilter(AppDbContext dbContext)
{
_dbContext = dbContext;
} public override void OnSubscribeExecuting(ExecutingContext context)
{
_transaction = _dbContext.Database.BeginTransaction();
} public override void OnSubscribeExecuted(ExecutedContext context)
{
_transaction.Commit();
} public override void OnSubscribeException(DotNetCore.CAP.Filter.ExceptionContext context)
{
_transaction.Rollback();
}
}

2、配置过滤器


services.AddCap(opt =>
{
// ***
}.AddSubscribeFilter<MyCapFilter>();

以上就是消费端的一个简单示例。


本文地址:http://www.cnblogs.com/savorboard/p/cap-auto-transaction.html

作者博客:Savorboard

本文原创授权为:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本

在 ASP.NET Core 中自动启用 CAP 事务的更多相关文章

  1. 在ASP.NET Core中添加的Cookie如果含有特殊字符,会被自动转义

    我们知道在Cookie中有些字符是特殊字符,这些字符是不能出现在Cookie的键值中的. 比如"="是Cookie中用来分隔键和值的特殊字符,例如:Key01=Value01,表示 ...

  2. ASP.NET Core-Docs:在 ASP.NET Core 中启用跨域请求(CORS)

    ylbtech-ASP.NET Core-Docs:在 ASP.NET Core 中启用跨域请求(CORS) 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部 1. ...

  3. 在ASP.NET Core 中使用Cookie中间件

    在ASP.NET Core 中使用Cookie中间件 ASP.NET Core 提供了Cookie中间件来序列化用户主题到一个加密的Cookie中并且在后来的请求中校验这个Cookie,再现用户并且分 ...

  4. Hangfire在ASP.NET CORE中的简单实现

    hangfire是执行后台任务的利器,具体请看官网介绍:https://www.hangfire.io/ 新建一个asp.net core mvc 项目 引入nuget包 Hangfire.AspNe ...

  5. ASP.NET Core中的OWASP Top 10 十大风险-跨站点脚本攻击 (XSS)

    不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: https://dotnetcoretutorials.com/201 ...

  6. [译]在Asp.Net Core 中使用外部登陆(google、微博...)

    原文出自Rui Figueiredo的博文<External Login Providers in ASP.NET Core> 摘要:本文主要介绍了使用外部登陆提供程序登陆的流程,以及身份 ...

  7. ASP.NET CORE中使用Cookie身份认证

    大家在使用ASP.NET的时候一定都用过FormsAuthentication做登录用户的身份认证,FormsAuthentication的核心就是Cookie,ASP.NET会将用户名存储在Cook ...

  8. 【翻译】asp.net core中使用FluentValidation来进行模型验证

    asp.net core中使用FluentValidation FluentValidation 可以集成到asp.net core中.一旦启用,MVC会在通过模型绑定将参数传入控制器的方法上时使用F ...

  9. 【译】在Asp.Net Core 中使用外部登陆(google、微博...)

    原文出自Rui Figueiredo的博文<External Login Providers in ASP.NET Core> (本文很长) 摘要:本文主要介绍了使用外部登陆提供程序登陆的 ...

随机推荐

  1. eh-admin一套前后端一体的轻量级后台管理系统

    https://gitee.com/DawnYang/eh-admin 主要技术 后端技术:Spring Boot,Apache Shiro,MyBatis-Plus等: 前端技术:Jquery,La ...

  2. VS在调试桌面程序时,cout到控制台方法

    参考博客:https://blog.csdn.net/xinxinsky/article/details/80733400 C++桌面程序设置 Properties -> Build Event ...

  3. 在Excel中怎样才能在某一行前面一次插入多行?

    你在要插入的行以下选中多少行,点插入,就能插入多少行. ​

  4. 论如何在服务器上部署一个自己的web前端项目

    就在前两天,有新人通过邮箱问到笔者,如何部署自己的web前端项目?笔者在此详细介绍. 一.购买云服务器 配置用户名密码.安全组 二.下载Xshell于Xftp工具 用于登录服务器和文件上传 三.在li ...

  5. React Native startReactApplication 方法简析

    在 React Native 启动流程简析 这篇文章里,我们梳理了 RN 的启动流程,最后的 startReactApplication 由于相对复杂且涉及到最终执行前端 js 的流程,我们单独将其提 ...

  6. spring boot 系列之七:SpringBoot整合Mybatis

    springboot已经很流行,但是它仍需要搭配一款ORM框架来实现数据的CRUD,之前已经分享过JdbcTemplete和JPA的整合,本次分享下Mybatis的整合. 对于mybatis的使用,需 ...

  7. webservice学习总结(一)-- WebService相关概念介绍

    一.WebService是什么? 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 一个跨语言.跨平台的规范(抽象) 多个跨平台.跨语言的应用间通信整合的方案(实际) 二.为什么要用 ...

  8. Docker容器编排工具——docker-compose

    1.docker-compose介绍 2.使用的三个步骤 3.安装docker-compose yum install docker-compose 4.docker-compose.yml 文件 ( ...

  9. try/catch捕获处理异常

    1.throws是中断处理,后续代码不能执行 try/catch方法体之后的后续代码有没有异常都可以继续执行: 2.当try方法体中出现异常才会执行catch方法体中代码

  10. shell 脚本 根据PID过滤查看进程所有信息

    #!/bin/bash read -p "输入要查询的PID: " P #筛选第二列等于输入的PID号 n=`ps aux | awk '$2~/^'$P'$/ {print $1 ...