У меня настроен и работает маршрутный лист MassTransit. Для справки: маршрутная квитанция принимает идентификатор элемента в базе данных MongoDB, а затем создает «версию» этого документа в базе данных SQL с помощью EF Core. Действия (как команды):
- Перенести документ в SQL
- Обновить информацию аудита в документе MongoDB
- Обновить статус документа MongoDB (т.е. опубликовать)
Все вышеперечисленное - это команды записи.
Я добавил новый 1-й шаг, который запускает запрос, чтобы убедиться, что документ MongoDB действителен (например, поля имени и описания заполнены) перед запуском миграции. Если этот шаг не удается, он генерирует настраиваемое исключение, которое, в свою очередь, запускает неудачное событие, которое затем подбирается и управляется моей сагой. Ниже приведен фрагмент кода моей активности, за которым следует код построителя маршрутной квитанции:
Код активности
var result = await _queryDispatcher.ExecuteAsync<SelectModuleValidationResultById, ModuleValidationResult>(query).ConfigureAwait(false);
if (!result.ModuleValidationMessages.Any())
{
return context.Completed();
}
return context.Faulted(new ModuleNotValidException
{
ModuleId = messageCommand.ModuleId,
ModuleValidationMessages = result.ModuleValidationMessages
});
Код построения маршрутной квитанции
builder.AddActivity(
nameof(Step1ValidateModule),
context.GetDestinationAddress(ActivityHelper.BuildQueueName<Step1ValidateModule>(ActivityQueueType.Execute)),
new SelectModuleValidationResultById(
context.Message.ModuleId,
context.Message.UserId,
context.Message.LanguageId)
);
builder.AddSubscription(
context.SourceAddress,
RoutingSlipEvents.ActivityFaulted,
RoutingSlipEventContents.All,
nameof(Step1ValidateModule),
x => x.Send<IModuleValidationFailed>(new
{
context.Message.ModuleId,
context.Message.LanguageId,
context.Message.UserId,
context.Message.DeploymentId,
}));
Хотя все это работает и событие подхватывается моей сагой, я в идеале хотел бы добавить ModuleValidationMessages (т.е. любые неудачные сообщения проверки) к возвращаемому событию, но я не могу понять, как или даже если это возможно (или более принципиально если это правильно делать).
Стоит отметить, что это проверка в крайнем случае, и что валидация проверяется клиентом еще до того, как попытаться выполнить миграцию, поэтому в худшем сценарии я могу просто оставить, что у него есть «Проблемы с валидацией», но в идеале я хотел бы включить отказ в неудавшийся ответ.