Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “理解”;定稿;集体运输_C#_.net_Masstransit - Fatal编程技术网

C# “理解”;定稿;集体运输

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 {

我很难理解Finalize()在MassTransit中是如何工作的,特别是它是否可以在初始状态下执行。设置:

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);