发布时不包含 CorrelationId from/to Saga

CorrelationId is not included when publish from/to Saga

我正在使用 MassTransit Sagas。它在传入事件(AccountCreatedInWebAppEvent)进行一些处理并随后发布时启动 另一个事件 (SagaAccountCreatedEvent)

我有一个监听 SagaAccountCreatedEvent 的消费者,但在消费者中,如果我没有像下面的示例那样明确设置它,context.CorrelationId 为 null (return new SagaAccountCreatedEvent() {.. .})。 Saga-magic 是否应该包含 correlationId 而无需我将其插入到消息中? (同样适用于从消费者发布到 Saga-"handler")

InstanceState(i => i.CurrentState);
Event(() => AccountCreatedInWebAppEvent, e => e.CorrelateBy<int>(sagaState => sagaState.AccountId, context => context.Message.Account.AccountId)
                                                .SelectId(context => Guid.NewGuid()))

...

Initially(
    When(AccountCreatedInWebAppEvent)
        .Then(context =>
        {
            context.Instance.AccountId = context.Data.Account.AccountId;
            context.Instance.CreatedInWebApp = DateTime.Now; 
        })
        .TransitionTo(AccountCreatedSentOut)
        .Publish(context =>
        {
            return new SagaAccountCreatedEvent() { Account = context.Data.Account, CorrelationId = context.CorrelationId.Value };
        })

消费者方法

public 异步任务消耗(ConsumeContext 上下文) {

//here context.correlationId is null

}

由于您的初始事件与 int 属性 相关,您正在用 SelectId(x => Guid.NewGuid()) 初始化 实例 。要在发布后续事件时获得该值,您应该使用 context.Instance.CorrelationId,如下所示:

.Publish(context =>
    new SagaAccountCreatedEvent() 
    {
        Account = context.Data.Account,
        CorrelationId = context.Instance.CorrelationId
    })

您使用的值 context.CorrelationId 来自 saga 的消费上下文,并且仅存在于使用 CorrelationId 由 Guid 直接关联的事件中。