我已配置并运行了 MassTransit 路由单。作为参考,路由单采用 MongoDB 数据库中项目的 ID,然后使用 EF Core 在 SQL 数据库中创建该文档的“版本”。活动(作为命令)是:
- 将文档迁移到 SQL
- 更新 MongoDB 文档中的审计信息
- 更新 MongoDB 文档状态(即已发布)
以上都是写命令。
我添加了一个新的第一步,它在运行迁移之前运行查询以确保 MongoDB 文档有效(例如,名称和描述字段已完成)。如果这一步失败,它会抛出一个自定义异常,进而触发一个失败的事件,然后由我的 saga 拾取和管理。下面是我的活动代码片段,后跟路由单生成器代码:
活动代码
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 (即任何失败的验证消息)添加到返回的事件中,但我无法弄清楚如何或即使这是可能的(或更多基本上,如果这样做是正确的)。
值得注意的是,这是最后的检查,并且验证是由客户端在尝试迁移之前检查的,所以更糟糕的情况是我可以让它有“有验证问题”,但理想情况下我想将脱轨包含在响应失败。