Saga 数据和 Saga 消息之间需要更复杂的自定义映射
Need more complex custom mapping between Saga data and Saga message
假设我有消息
public interface ISagaMessage
{
string Type1 { get; set; }
string Type2 { get; set; }
...
}
是否可以为 Type1 值或 Type2 值构建可互换的 Saga,以便所有这 3 条消息都应该在同一个 Saga 下工作:
Message1: Type1 = AA, Type2 = null
Message2: Type1 = AA, Type2 = BB
Message3: Type1 = BB, Type2 = null
期望的场景:第一条消息创建 Saga (AA,null),然后 Message2 挂接到同一个 Saga,因为它的类型对 (AA,BB) 与元素 AA 与 (AA,null) 重叠。 Next Message3 现在被 BB 值重叠。如果新消息 Message4 带有 Type1 = CC,Type2 = null,将创建新的 Saga。
只能有2种特定的类型值组合,所以AA总是带BB,CC总是带DD,EE带FF等。例如AA永远不会带CC。 Saga 事先不知道所有这些类型值组合,所以接收 (AA,null) 它不能基于 (AA,BB) 创建 Saga,BB 在这一步是未知的
如果我能够构建自定义代码来选择正确的 Saga,我会想出这样的东西(跳过空检查):
public Saga GetSaga(ISagaMessage message)
{
IList<Saga> existibgSagas = GetExistingSagas();
return existibgSagas.FirstOrDefault(
s => s.Type1 == message.Type1 || s.Type1 == message.Type2 ||
s.Type2 == message.Type1 || s.Type2 == message.Type2))
}
默认的 saga finder 实现无法做到这一点,但您可以提供自己的自定义 IFindSagas 实现。这可能会成功。
在 https://docs.particular.net/nservicebus/sagas/saga-finding 查看文档。
样本位于 https://docs.particular.net/samples/saga/nh-custom-sagafinder/ and https://docs.particular.net/samples/saga/ravendb-custom-sagafinder/。
假设我有消息
public interface ISagaMessage
{
string Type1 { get; set; }
string Type2 { get; set; }
...
}
是否可以为 Type1 值或 Type2 值构建可互换的 Saga,以便所有这 3 条消息都应该在同一个 Saga 下工作:
Message1: Type1 = AA, Type2 = null
Message2: Type1 = AA, Type2 = BB
Message3: Type1 = BB, Type2 = null
期望的场景:第一条消息创建 Saga (AA,null),然后 Message2 挂接到同一个 Saga,因为它的类型对 (AA,BB) 与元素 AA 与 (AA,null) 重叠。 Next Message3 现在被 BB 值重叠。如果新消息 Message4 带有 Type1 = CC,Type2 = null,将创建新的 Saga。
只能有2种特定的类型值组合,所以AA总是带BB,CC总是带DD,EE带FF等。例如AA永远不会带CC。 Saga 事先不知道所有这些类型值组合,所以接收 (AA,null) 它不能基于 (AA,BB) 创建 Saga,BB 在这一步是未知的
如果我能够构建自定义代码来选择正确的 Saga,我会想出这样的东西(跳过空检查):
public Saga GetSaga(ISagaMessage message)
{
IList<Saga> existibgSagas = GetExistingSagas();
return existibgSagas.FirstOrDefault(
s => s.Type1 == message.Type1 || s.Type1 == message.Type2 ||
s.Type2 == message.Type1 || s.Type2 == message.Type2))
}
默认的 saga finder 实现无法做到这一点,但您可以提供自己的自定义 IFindSagas 实现。这可能会成功。
在 https://docs.particular.net/nservicebus/sagas/saga-finding 查看文档。
样本位于 https://docs.particular.net/samples/saga/nh-custom-sagafinder/ and https://docs.particular.net/samples/saga/ravendb-custom-sagafinder/。