【问题标题】:How to configure MassTransit Saga in Asp.Net Core application如何在 Asp.Net Core 应用程序中配置 MassTransit Saga
【发布时间】:2019-10-31 16:56:52
【问题描述】:

我正在尝试将简单的 MassTransit Saga 集成到 ASP.NET Core 应用程序中。 在ConfigureServices 期间,我有:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<ISagaRepository<Request>, InMemorySagaRepository<Request>>();
    services.AddMassTransit(x =>
    {
        x.AddSagaStateMachine<RequestStateMachine, Request>();
        x.AddBus(provider => Bus.Factory.CreateUsingInMemory(cfg =>
        {
            cfg.UseInMemoryOutbox();
            cfg.ConfigureEndpoints(provider);
        }));
    });
}

稍后我发布消息:

var bus = context.RequestServices.GetService<IBusControl>();
await bus.Publish<IRequestCreated>(new
{
    CorrelationId = Guid.NewGuid(),
    ClientId = 1,
});

但它永远不会到达 Saga 实例。

我的传奇是这样的:

    public class RequestStateMachine : MassTransitStateMachine<Request>
    {
        public RequestStateMachine()
        {
            InstanceState(x => x.CurrentState);

            Event(
                () => RequestCreated,
                x => x.CorrelateById(context => context.Message.CorrelationId).SelectId(context => Guid.NewGuid()));

            Initially(
                When(RequestCreated)
                    .Then(context =>
                    {
                        Console.WriteLine($"Request received, id = {context.Instance.CorrelationId}");
                        context.Instance.RequestId = 10;
                    })
                    .TransitionTo(Active)
            );

            SetCompletedWhenFinalized();
        }

        public State Active { get; protected set; }

        public Event<IRequestCreated> RequestCreated { get; protected set; }
    }

    public class Request : SagaStateMachineInstance
    {
        public string CurrentState { get; set; }

        public Guid CorrelationId { get; set; }

        public long RequestId { get; set; }

        public Guid? ExpirationId { get; set; }
    }

我想我做错了什么,但不知道是什么。

【问题讨论】:

  • 你在公共汽车上打电话吗?通常通过使用解析总线并启动它的 IHostedService。
  • 谢谢克里斯,我没有打电话给IBusControl.StartAsync,这就是原因。

标签: c# asp.net-core masstransit saga


【解决方案1】:

我不得不承认这有点令人困惑。我们在 Microsoft DI 包和 ASP.NET Core 集成包中都有 AddMassTransit 方法,它们做不同的事情。

AspNetCoreIntegration 包中的AddMassTransit 还注册了启动和停止总线的服务。所以,这段代码可以解决你的问题:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<ISagaRepository<Request>, InMemorySagaRepository<Request>>();
    services.AddMassTransit(
        provider => 
            Bus.Factory.CreateUsingInMemory(cfg =>
            {
                cfg.UseInMemoryOutbox();
                cfg.ConfigureEndpoints(provider);
            },
        x => x.AddSagaStateMachine<RequestStateMachine, Request>()
    );
}

您使用的方法只是在容器中将总线注册为IBusIBusControlISendEndpointProviderIPublishEndpointPervider,但它并不关心启动和停止总线。我在代码示例中使用的方法还注册了主机服务并(可选)添加了健康检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2016-11-02
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多