如何有条件地创建 MassTransit 传奇?

问题描述 投票:0回答:1

我有一个传奇,每当两个事件之一发生时就应该触发。但是,如果不满足数据库中的条件,则不应创建传奇。

我尝试过类似的方法,但似乎 saga 实例已保存到数据库中,但具有默认(空)值。所以看起来 if 语句是有效的,只是无论如何都创建了一个传奇。

我想我做得不对,但我不确定应该在哪里插入条件?

使用 MassTransit 版本 8.0.8

public MySaga()
{
    InstanceState(x => x.CurrentState, Processing);

    Event(() => EventOne, x => x.CorrelateById(context => context.Message.TransactionId));
    Event(() => EventTwo, x => x.CorrelateById(context => context.Message.TransactionId));

    Initially(
        When(EventOne)
            .IfAsync(async context => await ShouldCreateSaga(context),
                x => x
                    .Then(context =>
                    {
                        context.Saga.TransactionId = context.Message.TransactionId;
                    })
                    .TransitionTo(Processing)
            ),
        When(EventTwo)
            .IfAsync(async context => await ShouldCreateSaga(context),
                x => x
                    .Then(context =>
                    {
                        context.Saga.TransactionId = context.Message.TransactionId;
                    })
                    .TransitionTo(Processing)
            )
    );

    ...
}

private static async Task<bool> ShouldCreateSaga(PipeContext context)
{
    var serviceProvider = context.GetPayload<IServiceProvider>();
    var dbContext = serviceProvider.GetRequiredService<DbContext>();
    return await dbContext.SomeTable.AnyAsync(x => x.CreateSaga);
}
.net masstransit
1个回答
0
投票

如果不需要,您可以使用

IfElse
Finalize
传奇。

.IfElseAsync(async context => await ShouldCreateSaga(context),
    yes => yes
        .Then(context =>
        {
            context.Saga.TransactionId = context.Message.TransactionId;
        })
        .TransitionTo(Processing),
    no => no.Finalize()
);

// this should also be set, so that Final instances are removed
SetCompletedWhenFinalized();
© www.soinside.com 2019 - 2024. All rights reserved.