在 ASP.NET Core 中自动启用 CAP 事务
本篇文章旨在描述如何在 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 事务的更多相关文章
- 在ASP.NET Core中添加的Cookie如果含有特殊字符,会被自动转义
我们知道在Cookie中有些字符是特殊字符,这些字符是不能出现在Cookie的键值中的. 比如"="是Cookie中用来分隔键和值的特殊字符,例如:Key01=Value01,表示 ...
- ASP.NET Core-Docs:在 ASP.NET Core 中启用跨域请求(CORS)
ylbtech-ASP.NET Core-Docs:在 ASP.NET Core 中启用跨域请求(CORS) 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 1. ...
- 在ASP.NET Core 中使用Cookie中间件
在ASP.NET Core 中使用Cookie中间件 ASP.NET Core 提供了Cookie中间件来序列化用户主题到一个加密的Cookie中并且在后来的请求中校验这个Cookie,再现用户并且分 ...
- Hangfire在ASP.NET CORE中的简单实现
hangfire是执行后台任务的利器,具体请看官网介绍:https://www.hangfire.io/ 新建一个asp.net core mvc 项目 引入nuget包 Hangfire.AspNe ...
- ASP.NET Core中的OWASP Top 10 十大风险-跨站点脚本攻击 (XSS)
不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: https://dotnetcoretutorials.com/201 ...
- [译]在Asp.Net Core 中使用外部登陆(google、微博...)
原文出自Rui Figueiredo的博文<External Login Providers in ASP.NET Core> 摘要:本文主要介绍了使用外部登陆提供程序登陆的流程,以及身份 ...
- ASP.NET CORE中使用Cookie身份认证
大家在使用ASP.NET的时候一定都用过FormsAuthentication做登录用户的身份认证,FormsAuthentication的核心就是Cookie,ASP.NET会将用户名存储在Cook ...
- 【翻译】asp.net core中使用FluentValidation来进行模型验证
asp.net core中使用FluentValidation FluentValidation 可以集成到asp.net core中.一旦启用,MVC会在通过模型绑定将参数传入控制器的方法上时使用F ...
- 【译】在Asp.Net Core 中使用外部登陆(google、微博...)
原文出自Rui Figueiredo的博文<External Login Providers in ASP.NET Core> (本文很长) 摘要:本文主要介绍了使用外部登陆提供程序登陆的 ...
随机推荐
- jQuery中的属性过滤选择器(四、五):[attribute] 、[attribute=value]、[attribute!=value] 、[attribute^=value] 等
<!DOCTYPE html> <html> <head> <title>属性过滤选择器</title> <meta http-equ ...
- 解锁 VS Code 更多可能性,轻松入门 WebView
作者:HelloGitHub-小夏 说起 VS Code 大家普遍印象应该都差不多是这样:不就是个编辑器嘛,最主要的还是 coding 的快感咯. 里面很多功能都应该是围绕如何提高 coding 效率 ...
- 学习小计: Kaggle Learn Embeddings
Embedding表示map f: X(高维) -> Y(低维),减小数据维度,方便计算+提高准确率. 参看Kaggle Learn:https://www.kaggle.com/learn/e ...
- 并发编程之:Lock
大家好,我是小黑,一个在互联网苟且偷生的农民工. 在之前的文章中,为了保证在并发情况下多线程共享数据的线程安全,我们会使用synchronized关键字来修饰方法或者代码块,以及在生产者消费者模式中同 ...
- os.read
#-*-coding:utf-8-*-__author__ = "logan.xu"import oscmd_res=os.popen("ls").read() ...
- Kickstart部署之HTTP架构
原文转自:https://www.cnblogs.com/itzgr/p/10029527.html作者:木二 目录 一 准备 1.1 完整架构:Kickstart+DHCP+HTTP+TFTP+PX ...
- maven下载出错
求解
- 如何在MacBook M1上无缝切换Win11和MacOS?
2020年,MacBook M1发布后,由于其夸张到离谱的性能表现,苹果又一次在知名度和销量上真正实现了双丰收. 抛开M1和MacOS其他的华丽特色不谈,很多习惯了Windows系统的同学,在换了这台 ...
- Golang入门学习(五):异常处理
文章目录 2.5 错误处理机制 2.5.1 基本说明 2.5.2 入门示例 2.5.3 自定义错误 2.5 错误处理机制 2.5.1 基本说明 Go语言追求简洁优雅,因此并不支持传统的try-catc ...
- 注解@Component方式代替xml装配bean
一.@Component 用注解来装配bean 1. 2.对类使用注解,装配bean: 3.类中,注入其他对象: 二.bean.xml中配置@Componet方式装配bean 1.开启注解装配bean ...