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