В настоящее время у меня есть несколько саг, которые передают пользовательский CorrelationId для базового класса сообщений. Все события и команды наследуются от этого базового класса и поэтому имеют легкий доступ к CorrelationId. В результате сопоставления ConfigureHowToFindSaga
выглядят примерно так:
protected override void ConfigureHowToFindSaga(SagaPropertyMapper<MySagaData> mapper)
{
mapper.ConfigureMapping<MyCommand>(message => message.CorrelationId)
.ToSaga(sagaData => sagaData.CorrelationId);
mapper.ConfigureMapping<MyEvent>(message => message.CorrelationId)
.ToSaga(sagaData => sagaData.CorrelationId);
}
На каждом шаге саги (и других служб, с которыми общается саги) настраиваемый идентификатор CorrelationId в настоящее время вручную сопоставляется из сообщения всообщение вот так:
public Task Handle(MyCommand message, IMessageHandlerContext context)
{
// do something
return context.Publish(new MyEvent { CorrelationId = message.CorrelationId });
}
Мне было интересно, смогу ли я использовать заголовок сообщения NSB ConversationId
для замены пользовательского CorrelationId, так как я считаю, что NSB уже сопоставляет это от сообщения к сообщению автоматически.
У меня было два вопроса, касающихся этого:
1. Это звучит разумно?
2. Если да, есть ли простой способ настроить ConfigureMapping
отображения, чтобы сага читала из context.MessageHeaders[Headers.ConversationId]
, а не напрямую из свойства в теле сообщения? Я понимаю, что мог бы написать собственный SagaFinder, чтобы копаться в заголовках и получать ConversationId и использовать его, чтобы затем найти сагу. Тем не менее, я подумал, что если мне нужно сделать это для каждой саги, то, возможно, весь подход неверен. Спасибо