簡體   English   中英

從活動中引發事件

[英]Raise event from activity

我正在構建一個 saga state 機器,在下面精簡了實現:

public class DueDiligenceCaseCreateStateMachine : MassTransitStateMachine<DueDiligenceCaseCreateState>
{
    public State CreatingCase { get; private set; }

    public Event<DueDiligenceCaseCreateCommand> TriggerReceived { get; private set; }

    public Event CaseCreationFinished { get; private set; }

    public Event CaseCreationFailed { get; private set; }

    private readonly ILogger<DueDiligenceCaseCreateStateMachine> _logger;
    private readonly IOptions<DueDiligenceCaseCreateSagaOptions> _sagaOptions;

    public DueDiligenceCaseCreateStateMachine(
        ILogger<DueDiligenceCaseCreateStateMachine> logger,
        IOptions<DueDiligenceCaseCreateSagaOptions> sagaOptions)
    {
        _logger = logger;
        _sagaOptions = sagaOptions;

        Configure();
        BuildProcess();
    }

    private void Configure()
    {
        Event(
            () => TriggerReceived,
            e => e.CorrelateById(x => x.Message.DueDiligenceCaseId));
    }

    private void BuildProcess()
    {
        During(
            Initial,
            When(TriggerReceived)
                .TransitionTo(CreatingCase)
                .Activity(CreateCase));
    }
    
    
    private EventActivityBinder<DueDiligenceCaseCreateState, DueDiligenceCaseCreateCommand> CreateCase(
        IStateMachineActivitySelector<DueDiligenceCaseCreateState, DueDiligenceCaseCreateCommand> sel) =>
        sel.OfType<CreateCaseActivity>();
}

活動本身在這里:

public class CreateCaseActivity : BaseActivity<DueDiligenceCaseCreateState, DueDiligenceCaseCreateCommand>
{
    private readonly ICommandHandler<InitializeCaseCommand> _initializeCaseHandler;
    private readonly IOptions<ApplicationOptions> _options;
    private readonly ILogger<DueDiligenceCaseCreateConsumer> _logger;

    public CreateCaseActivity(
        ICommandHandler<InitializeCaseCommand> initializeCaseHandler,
        IOptions<ApplicationOptions> options,
        ILogger<DueDiligenceCaseCreateConsumer> logger)
    {
        _initializeCaseHandler = initializeCaseHandler;
        _options = options;
        _logger = logger;
    }

    public override async Task Execute(
        BehaviorContext<DueDiligenceCaseCreateState, DueDiligenceCaseCreateCommand> context,
        Behavior<DueDiligenceCaseCreateState, DueDiligenceCaseCreateCommand> next)
    {
        _logger.LogInformation(
            "Consuming {Command} started, case id: {caseid}, creating a case...",
            nameof(DueDiligenceCaseCreateCommand),
            context.Data.DueDiligenceCaseId);

        var initializeCaseCmd = ConvertMessageToCommand(context.Data);
        
        initializeCaseCmd.CanHaveOnlyOneActiveCasePerCustomer = !_options.Value.FeatureToggles.AllowMultipleActiveCasesOnSingleCustomer;

        try
        {
            await _initializeCaseHandler.Handle(initializeCaseCmd);
        }
        catch 
        {
        
        }
        finally
        {
            await next.Execute(context);
        }
    }

    private InitializeCaseCommand ConvertMessageToCommand(DueDiligenceCaseCreateCommand message) =>
        // returns the command object
}

state 機器現在有兩個事件 - CaseCreationFinishedCaseCreationFailed 我想在活動的try子句中提出第一個,在catch部分提出另一個。 我看到作為參數傳入的上下文 object 具有Raise方法,但問題是我無法從活動中訪問 DueDiligenceCaseCreateStateMachine.CaseCreationFinished。 有辦法嗎?

BehaviorContext上有一個Raise方法,為什么不使用它呢?

更新

您可以為 state 機器本身添加對您的活動的依賴,這將使您能夠訪問事件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM