是否有可能将传入消息与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持久性。
对于支持查询的Saga持久性提供程序,查询的相关性是可能的。 MongoDB持久性提供程序支持使用查询,但您需要记住,LINQ查询不能正确转换为MongoDB查询。
根据您的情况,我建议启用MongoDB查询跟踪,就像在此问题中所建议的那样:How do I log my queries in MongoDB C# Driver 2.0?
某些持久性提供程序,特别是那些使用像Redis这样的键值数据库的持久性提供程序,不支持通过查询进行关联,但是通常在您尝试使用查询时它们就会抛出“不支持的”异常。