Как настроить MassTransit Saga в приложении Asp.Net Core - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь интегрировать простую 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; }
    }

Полагаю, я делаю что-то не так, но не могу понять, что.

1 Ответ

1 голос
/ 01 ноября 2019

Должен признать, это немного сбивает с толку. У нас есть AddMassTransit методы как в пакете Microsoft DI, так и в пакете интеграции ASP.NET Core, и они делают разные вещи.

AddMassTransit из пакета AspNetCoreIntegration также регистрирует службу, которая запускает и останавливает шину. Итак, этот код решит вашу проблему:

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>()
    );
}

Метод, который вы используете, просто регистрирует шину как IBus, IBusControl, ISendEndpointProvider и IPublishEndpointPervider в контейнере, но это не так. позаботься о запуске и остановке автобуса. Метод, который я использовал в примере кода, также регистрирует службу хоста и (необязательно) добавляет проверки работоспособности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...