C# “理解”;定稿;集体运输
我很难理解Finalize()在MassTransit中是如何工作的,特别是它是否可以在初始状态下执行。设置:C# “理解”;定稿;集体运输,c#,.net,masstransit,C#,.net,Masstransit,我很难理解Finalize()在MassTransit中是如何工作的,特别是它是否可以在初始状态下执行。设置: public Event<ICrawlRequestCreated> CrawlCreated { get; private set; } public Event CrawlFailed { get; private set; } public State Executing { get; private set; } public State Completed {
public Event<ICrawlRequestCreated> CrawlCreated { get; private set; }
public Event CrawlFailed { get; private set; }
public State Executing { get; private set; }
public State Completed { get; private set; }
public State Failed { get; private set; }
public WorkflowSaga()
{
InstanceState(x => x.CurrentState);
Initially(
When(CrawlCreated)
.Then(HandleCrawlRequestCreated)
.TransitionTo(Executing),
When(CrawlFailed)
.Then(HandleCrawlFailed)
.TransitionTo(Failed)
.Finalize()
);
...
SetCompletedWhenFinalized();
}
它正确地触发HandleCrawlFail,但不会从存储库中删除状态机实例(SQL Server通过EF)。但是,如果我在执行状态期间引发爬网失败,则实例将从存储库中删除。我缺少什么?您应该使用.Catch()方法,而不是在方法中捕获异常。在.Catch中,您可以完成,而不是转换到执行状态
如果您在Initial中完成,它将永远不会将状态机持久化到数据库中,但我没有编写EF存储库,而且我不确定测试覆盖率是否确保了这一点。似乎只有在尚未完成的情况下,才将saga实例添加到上下文中。但是下一行也可以在if中看到:嘿,Chris,我想知道在
Catch
方法中是否有可能Finalize
?在TransistionExtensions
中,似乎没有Finalize
方法用于ExceptionActivityBinder
,只用于EventActivityBinder
,无法在Catch
方法中获取EventActivityBinder
。很可能只需要添加扩展方法。在catch块中转换到Final
状态是完全合法的,我肯定我没有想到要添加它。
context.Raise(CrawlFailed);