Можно ли сопоставить сообщение в MassTransit Saga, которое не основано на идентификаторе? - PullRequest
0 голосов
/ 08 января 2020

Можно ли сопоставить входящее сообщение с сагой, не имеющей соотношения Id или свойства 1: 1? Я пытаюсь сделать что-то вроде следующего, но CorrelateBy, похоже, не увлажняет сагу или не запускает какую-либо обработку.

    public interface SubmitOrder
    {
        Guid OrderId { get; }

        string[] ItemIds { get; }
    }

    public interface ItemStockExhausted
    {
        string Id { get; }
    }

    public class OrderState :
        SagaStateMachineInstance
    {
        public Guid CorrelationId { get; set; }

        public string[] ItemIds { get; set; }

        public int CurrentState { get; set; }
    }

    public class OrderStateMachine :
        MassTransitStateMachine<OrderState>
    {
        public OrderStateMachine()
        {
            InstanceState(x => x.CurrentState);
            Event(() => SubmitOrder, x
                => x.CorrelateById(context => context.Message.OrderId)
            );

            Event(() => ItemStockExhausted, x
                => x.CorrelateBy((state, context) => state.ItemIds.Contains(context.Message.Id))
            );

            Initially(
                When(SubmitOrder)
                    .Then(x => x.Instance.ItemIds = x.Data.ItemIds)
                    .TransitionTo(Submitted));

            During(Submitted,
                When(ItemStockExhausted)
                    .Then(x => { /* Do something */ })
                    );
        }

        public Event<SubmitOrder> SubmitOrder { get; private set; }

        public Event<ItemStockExhausted> ItemStockExhausted { get; private set; }

        public State Submitted { get; private set; }
    }

Не уверен, что это имеет какое-то значение, но я использую MongoDB сохранение.

1 Ответ

1 голос
/ 08 января 2020

Корреляция по запросу возможна для поставщиков персистентности Saga, которые поддерживают запросы. Поставщик сохраняемости MongoDB поддерживает использование запросов, но вам следует помнить, что запросы LINQ не преобразуются в запросы MongoDB правильно.

В вашем случае я бы посоветовал включить трассировку запросов MongoDB, как это предлагается в этом вопросе: Как регистрировать свои запросы в MongoDB C# Driver 2.0?

Некоторые поставщики персистентности, особенно те, которые используют базы данных значений ключей, такие как Redis, не поддерживают корреляцию по запросам, но обычно выдают «неподдерживаемое» исключение, как только вы попытаетесь использовать запрос.

...