本篇文章旨在描述如何在 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. 【AE】多表的联合查询

    多表的联合查询 // Create the query definition. IQueryDef queryDef = featureWorkspace.CreateQueryDef(); // P ...

  2. itoa函数递归实现

    库函数中有atoi函数,用意是将字符形式输入的数据转换成数字,而库函数有没有提供一个将数字转换成字符的函数呢?答案是有的,而且功能很是强大,那就是sprintf().snprintf()格式化转换函数 ...

  3. Redis常用技术

    Xml配置: <?xml version='1.0' encoding='UTF-8' ?> <!-- was: <?xml version="1.0" e ...

  4. react项目实现多语言切换

    网站的语言切换功能大家都见过不少,一般都是一个下拉框选择语言,如果让我们想一下怎么实现这个功能,我相信大家都是有哥大概思路,一个语言切换的select,将当前的选择的语言存在全局,根据这个语言的key ...

  5. 有关spring注解总结

    前言 目前企业开发多采用纯注解的方式开发,注解开发的好处:简洁,可读性强 最近学习了spring全家桶,总结了有关spring的常用注解,写的不对的地方,欢迎指正 Spring模块注解 @Config ...

  6. 编写你的第一个Django应用

    安装 Python 作为一个 Python Web 框架,Django 需要 Python.更多细节请参见 我应该使用哪个版本的 Python 来配合 Django?. Python 包含了一个名为  ...

  7. Spring笔记(3)

    一.JDBC Template基本使用 1.开发步骤 1.1直接使用template 导入spring-jdbc和spring-tx坐标 <!-- JDBC--> <dependen ...

  8. 20210717 noip18

    考前 从小饭桌出来正好遇到雨下到最大,有伞但还是湿透了 路上看到一个猛男搏击暴风雨 到了机房收拾了半天才开始考试 ys 他们小饭桌十分明智地在小饭桌看题,雨下小了才来 考场 状态很差. 开题,一点想法 ...

  9. Linux上项目部署在home目录中无法访问的问题

    在Linux上开发一个Web项目,使用nginx作为Web服务器.在nginx的配置文件中添加一个server,root路径写的是放在home目录中的项目目录的路径.打开浏览器访问,提示错误:403 ...

  10. LinkedList 添加元素源码解析

    jdk版本:1.8 LinkedList添加元素有两个方法:add(E e)和add(int index,E e). add(E e) /** * Appends the specified elem ...