问题描述
在尝试采用大众运输系统时,我正在尝试学习更多有关大众运输系统的信息.现在,我在下面有了基于Saga的类,该类可以按预期工作:
I am trying to learn more about Mass Transit as we are thinking about adopting it. I now have the class based Saga below, which works as expected:
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 .
A class based Saga is different to a state machine Saga and is described more in the docs here in the Saga section: http://masstransit-project.com/MassTransit/understand/key-ideas.html.
如何在消耗EchoEnd之后将Saga标记为已完成,以便将Saga从数据库中删除(我已经设置了存储库)?如果我正在使用状态机Saga,则可以执行以下操作:
How do I mark the Saga as finalized after EchoEnd is consumed so it is deleted from the database (I have already setup the repository)? If I was using a state machine Saga, then I could do this:
.Finalize()
.SetCompletedWhenFinalized()
我该如何使用基于Saga的类?
How do I do this with a class based Saga?
我意识到我在这里可能会倒退一点,但是我正在尝试学习大众运输的开始方式以及现在的位置,看看它是否符合我们的要求.到目前为止非常满意.
I realise I may be going backwards a bit here, however I am trying to learn how Mass Transit started and where it is now to see if it meets our requirements. Very pleased with it so far.
推荐答案
如果将ConsumeContext
强制转换为SagaConsumeContext<TSaga, TMessage>
,则存在SetCompleted
方法,该方法表明传奇已完成,可以从存储库中删除.
If you cast the ConsumeContext
to SagaConsumeContext<TSaga, TMessage>
, there is a SetCompleted
method which signals the saga is complete and can be removed from the repository.
如果直接投射不起作用(由于在管道中使用代理),则可能需要使用context.GetPayload<SagaConsumeContext<TSaga, TMessage>>()
.
You may need to use context.GetPayload<SagaConsumeContext<TSaga, TMessage>>()
if casting directly doesn't work (due to proxy use in the pipeline).
这篇关于如何确定基于Saga的类,以便将其从SQL数据库(EF Core)中删除?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!