8 MassTransit 基于 EF 的 Saga 模式

阅读本篇文章前,请了解上篇文章“Saga 模式”
使用EF持久化需要使用依赖注入容器(不使用依赖注入我不知道怎么做)

安装包

依赖注入包:
MassTransit.Extensions.DependencyInjection
EF Core包:
MassTransit.EntityFrameworkCore
SqlServer EF包:
由于我使用SqlServer,所有安装如下包
Microsoft.EntityFrameworkCore.SqlServer

Saga指定主键

// 下单 Saga
public class PlaceOrderSaga:
    // Saga 接口,必须继承
    ISaga,
    // 用于创建Saga实例的命令
    InitiatedBy<PlaceOrderCommand>,
    // 后续命令
    Orchestrates<CheckInStoreCommand>,
    Orchestrates<PayCompletedEnvet> 
{
    // 指定主键
    [Key]
    public Guid CorrelationId { get; set; }
    
    public int MySagaState { get; set; }

    // 处理"下单开始命令"
    public Task Consume (ConsumeContext<PlaceOrderCommand> context) {
        Console.WriteLine ("下单开始");
        // 发送"检查库存命令"
        context.Publish (new CheckInStoreCommand (context.CorrelationId.Value));
        return Task.CompletedTask;
}

    ...
}

新建数据库上下文

public class MyDbContext : DbContext {
    public MyDbContext (DbContextOptions<MyDbContext> options) : base (options) { }

    // 存储 PlaceOrderSaga
    public DbSet<PlaceOrderSaga> PlaceOrderSagas { get; set; }
}

添加Saga到总线

static void Main (string[] args) {
    // 新建服务集合(DI容器)
    IServiceCollection services = new ServiceCollection ();
    
    // 添加 MassTransit
    services.AddMassTransit (config => {
        // 注入 Saga 到 DI
        // 使用基于 EFCore 的仓库
        config.AddSaga<PlaceOrderSaga> ().EntityFrameworkRepository (r => {
            // Pessimistic 模式
            r.ConcurrencyMode = ConcurrencyMode.Pessimistic;

            // 添加注入数据库
            r.AddDbContext<DbContext, MyDbContext> ((provider, builder) => {
                builder.UseSqlServer ("Data Source=(localdb)\\ProjectsV13;Initial Catalog=MassTransitTest;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False");
            });
        });

        // 添加总线
        config.AddBus (service => {
            // 创建基于内存的总线
            var bus = Bus.Factory.CreateUsingInMemory (config => {
                // 设置接收队列,队列名 test_queue
                config.ReceiveEndpoint ("test_queue", ep => {
                    // 添加 Saga PlaceOrderSaga
                    ep.ConfigureSaga<PlaceOrderSaga> (service);
                });
            });

            return bus;
        });
	});

	var serviceProvicer = services.BuildServiceProvider ();

    // 创建数据库
    // 这里为了方便直接使用代码创建数据库
    // 在实际项目中你应该使用EF迁移创建数据库
    var myDbContext = serviceProvicer.GetService<DbContext> ();
	myDbContext.Database.EnsureCreated ();

	var bus = serviceProvicer.GetService<IBusControl> ();

	bus.Start ();

    // 发布消息,Publish 方法向所有队列发送消息
	bus.Publish (new PlaceOrderCommand ()).Wait ();

    Console.WriteLine ("Press any key to exit");
	Console.ReadKey ();

    bus.Stop ();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NServiceBus 是一个.Net平台下开源的消息服务框架,这类产品有时也被称作ESB(Enterprise Service Bus)——企业服务总线。NServiceBus也是dotnet世界里面最流行的开源企业服务总线。       NServiceBus 是一个用于构建企业级 .NET系统的开源通讯框架。它在消息发布/订阅支持、工作流集成和高度可扩展性等方面表现优异,因此是很多分布式系统基础平台的理想选择。,它能够帮助开发人员在搭建企业.NET系统时避免很多典型的常见问题。同时,该框架也提供了一些可伸缩的关键特征,比如对发布/订阅的支持、集成的长时间工作流及深入的扩展能力等。       NServiceBus的核心并不依赖于MSMQ。NServiceBus可扩展性允许我们插入自行编写的通信传送器,、订阅存储器和工作流的实现。 NServiceBus的特性1、高性能和可扩展性可以广泛应用于许多业务领域,可扩展性和性能都经过了实战检验。2、具有自动重试的可靠性集成通过配置机制提供基于消息通讯的的最佳实践方案,能够识别错误响应并自动重试。3、工作流和后台任务调度通过Saga来完成长时间运行的流程定义和管理功能,提供强大而灵活的工作流功能。4、消息的集中审核流程很容易将整个分布式系统聚集到一个中心位置配置消息审核。5、通过发布/订阅来减少耦合提供了发布/订阅机制。可扩展、可配置、易于理解和易于使用。6、易于扩展和配置多个灵活的扩展点和配置选项,NServieBus可以根据用户需求对各个特性进行自定义配置。7、支持广泛的消息传输技术提供了MSMQ, RabbitMQ, SQL Server, Windows Azure Queues,Windows AzureService Bus消息传输机制,当然你也可以自定义或者选择由社区开发的消息传输方案。NServicebus官方地址:http://particular.net/git: https://github.com/Particular/NServiceBusNServiceBus原作者Udi Dahan,该产品最早于2006年发行了第一个版本,这是一个企业级的开源产品,企业开发需要购买License,参照:http://particular.net/licensing。 标签:消息框架
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值