如何完成基于 class 的 Saga,以便将其从 SQL 数据库 (EF Core) 中删除?

How do I finalize a class based Saga, so that it is deleted from the SQL database (EF Core)?

在我们考虑采用公共交通时,我正在尝试了解更多有关公共交通的信息。我现在有下面基于 class 的 Saga,它按预期工作:

public class EchoSaga : ISaga,
        InitiatedBy<TextEntered>,
        Orchestrates<TextEchoStart>,
        Orchestrates<EchoEnd>
    {
        public Guid CorrelationId { get; set; }
        public string CurrentState { get; set; }
        public string Text { get; set; }

        public Task Consume(ConsumeContext<TextEntered> context)
        {
            CurrentState = "Entered";
            Text = context.Message.Text;
            return Task.CompletedTask;
        }

        public Task Consume(ConsumeContext<TextEchoStart> context)
        {
            CurrentState = "Start";
            Text = context.Message.Text;
            return Task.CompletedTask;
        }

        public Task Consume(ConsumeContext<EchoEnd> context)
        {
            CurrentState = "End";
            Text = context.Message.Text;
            return Task.CompletedTask;
        }
    }

基于 class 的 Saga 不同于状态机 Saga,在 Saga 部分的文档中有更多描述:http://masstransit-project.com/MassTransit/understand/key-ideas.html.

如何在使用 EchoEnd 后将 Saga 标记为已完成,以便将其从数据库中删除(我已经设置了存储库)?如果我使用的是状态机 Saga,那么我可以这样做:

.Finalize()
.SetCompletedWhenFinalized()

如何使用基于 class 的 Saga 执行此操作?

我意识到我可能在这里倒退了一点,但是我正在尝试了解 Mass Transit 是如何开始的以及它现在在哪里,看看它是否符合我们的要求。到目前为止非常满意。

如果您将 ConsumeContext 转换为 SagaConsumeContext<TSaga, TMessage>,则有一个 SetCompleted 方法表明 saga 已完成并且可以从存储库中删除。

如果直接投射不起作用(由于在管道中使用代理),您可能需要使用 context.GetPayload<SagaConsumeContext<TSaga, TMessage>>()