本篇文章旨在描述如何在 ASP.NET Core
项目中并以一种简便的方式启用CAP事务,因为在我们的示例中都是直接演示比较直观的方式,没有进行封装,有些初学者同学不太会,找到问我如何封装,本篇文章主要是一个简单的演示。
在本示例中 ,我们主要是基于 Entity Framework
来进行演示,如果你使用其他 Orm 原理类似,大家参考即可。
一、发布端事务
由于大部分人都是在 Web
中使用,所以可以通过使用 ASP.NET Core
过滤器的方式进行,当然也可以通过中间件,原理是一致的。
1、创建一个 TypeFilter
,命名为 CapTransactionFilterAttribute
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
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
))] 即可生效。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[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 过滤器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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、配置过滤器
1
2
3
4
|
services.AddCap(opt =>
{
// ***
}.AddSubscribeFilter<MyCapFilter>();
|
以上就是消费端的一个简单示例。
到此这篇关于在 ASP.NET Core
中自动启用 CAP
事务详情的文章就介绍到这了,更多相关在 ASP.NET Core
中自动启用 CAP 事务内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://www.tuicool.com/articles/Qf2eau3