MassTransit 7.2.1测试框架中如何为saga注入初始状态?
MassTransit 7.2.1+ InMemorySagaRepository 初始状态注入方案
功能支持说明
MassTransit 7.2.1版本的InMemorySagaRepository仍然支持Saga初始状态注入,仅对公开API做了重构调整,原Add方法被替换为标准的Insert相关实现。
可用实现方案
方案1:对已初始化的仓储实例注入状态
如果你已经在测试基类中持有InMemorySagaRepository实例,直接调用Insert扩展方法即可替代原有逻辑,适配后代码如下:
private InMemorySagaRepository<TState> Repository { get; } protected async Task SeedSaga<TState>(TState seedState) where TState : class, SagaStateMachineInstance { await Repository.Insert(new SagaInstance<TState>(seedState), default); }
如果你的仓储实例是通过ISagaRepository<TState>接口持有,只需先做一次类型转换即可:
protected async Task SeedSaga<TState>(TState seedState) where TState : class, SagaStateMachineInstance { if (Repository is IInMemorySagaRepository<TState> inMemoryRepo) { await inMemoryRepo.Insert(new SagaInstance<TState>(seedState), default); } }
方案2:服务注册阶段预加载初始状态
如果你在测试服务配置阶段就可以确定初始Saga状态,可以直接在注册InMemory仓储时添加实例,无需额外操作仓储:
services.AddMassTransitTestHarness(config => { config.AddSagaStateMachine<YourStateMachine, YourSagaState>() .InMemoryRepository(repoConfig => { // 直接添加任意数量的初始Saga实例 repoConfig.AddInstance(new YourSagaState { CorrelationId = Guid.Parse("你的业务关联ID"), CurrentState = 1 /* 自定义初始状态值 */ }); }); });
两种方案的行为和旧版本Add方法完全一致,插入的Saga实例会被仓储正常托管,后续事件消费时可以正常匹配到对应实例。
内容的提问来源于stack exchange,提问作者dodbrian
相关产品推荐
相关产品推荐

