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



我正在尝试更多地了解公共交通,因为我们正在考虑采用它。 我现在在下面有基于类的 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;
        }
    }

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

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

.Finalize()
.SetCompletedWhenFinalized()

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

意识到我可能在这里有点倒退,但是我正在尝试了解公共交通是如何开始的以及现在的位置,看看它是否符合我们的要求。 到目前为止,对此非常满意。

如果你将ConsumeContext投射到 SagaConsumeContext<TSaga, TMessage> ,有一个SetCompleted方法,它表明 saga 是完整的,可以从存储库中删除。

如果直接强制转换不起作用(由于管道中使用代理(,则可能需要使用 context.GetPayload<SagaConsumeContext<TSaga, TMessage>>()

最新更新