是否可以在MassTransit Saga中关联不基于ID的消息?

问题描述 投票:0回答:1

是否有可能将传入消息与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持久性。

c# masstransit
1个回答
0
投票

对于支持查询的Saga持久性提供程序,查询的相关性是可能的。 MongoDB持久性提供程序支持使用查询,但您需要记住,LINQ查询不能正确转换为MongoDB查询。

根据您的情况,我建议启用MongoDB查询跟踪,就像在此问题中所建议的那样:How do I log my queries in MongoDB C# Driver 2.0?

某些持久性提供程序,特别是那些使用像Redis这样的键值数据库的持久性提供程序,不支持通过查询进行关联,但是通常在您尝试使用查询时它们就会抛出“不支持的”异常。

© www.soinside.com 2019 - 2024. All rights reserved.