如何在Masstransit statemachine传奇中正确设置活动?

如何在Masstransit statemachine传奇中正确设置活动?,masstransit,automatonymous,Masstransit,Automatonymous,这几天来,我一直在努力解决这个问题,但找不到一个真正有效的方法 我的场景是,我有一个状态机传奇,我想在这个传奇运行的同一个事务(实体框架)中做一些事情,以便状态和业务一起进行 现在,我已经了解到状态机本身不应该有任何依赖项,因此有一个活动(x=>x.OfInstanceType)活动可以添加,它可以从DI容器中解析,并且可以有任何依赖项(服务等)。到目前为止还不错 我的问题是,无论我在活动中执行什么,我都无法让它正常工作。它从容器中得到解析,并调用Execute方法,但随后不知何故它就退出了。

这几天来,我一直在努力解决这个问题,但找不到一个真正有效的方法

我的场景是,我有一个状态机传奇,我想在这个传奇运行的同一个事务(实体框架)中做一些事情,以便状态和业务一起进行

现在,我已经了解到状态机本身不应该有任何依赖项,因此有一个
活动(x=>x.OfInstanceType)
活动可以添加,它可以从DI容器中解析,并且可以有任何依赖项(服务等)。到目前为止还不错

我的问题是,无论我在活动中执行什么,我都无法让它正常工作。它从容器中得到解析,并调用
Execute
方法,但随后不知何故它就退出了。
似乎抛出了一些异常,但这显然不符合测试要求

我正在使用微软的dotnet核心依赖注入库

这里有一些代码

公共类MyStateMachine:MassTransitStateMachine
{
公共MyStateMachine()
{
InstanceState(instance=>instance.CurrentState);
事件(()=>Start,x=>x.correlationby(saga=>saga.CorrelationId,context=>context.Message.CorrelationId));
最初(
何时(开始)
.Activity(c=>c.OfType())
.转换(运行)
.Publish(新启动的())
);
}   
事件开始{get;set;}
运行{get;set;}的状态
}
公共类活动:活动
{
私有只读IMyService_服务;
公共活动(IMyService服务)
{
_服务=服务;
}
公共异步任务执行(BehaviorContext上下文,Behavior next)
{   
//抛出新异常(“BOO”);//取消对此行的注释不会抛出任何结果
_service.DoThatThing();
wait next.Execute(上下文).configurewait(false);
}
}
[事实]
公共异步任务RunMessageSent\u不存在Aga\u状态正在运行()
{
var线束=新的InMemoryTestHarness();
var machine=new MyStateMachine();
var collection=newservicecolection();
collection.AddMassTransit();
collection.RegisterInMemorySagaRepository();
collection.RegisterSagaStateMachine();
collection.addScope();
collection.addScope();
var provider=collection.BuildServiceProvider();
harnese.OnConfigureInMemoryReceiveEndpoint+=cfg=>cfg.StateMachineSaga(机器,提供程序);
等待线束。开始();
尝试
{
var guid=CorrelationId=guid.NewGuid();
等待线束.InputQueueSendEndpoint.Send(新运行({CorrelationId=guid}));
var repo=provider.GetService()作为InMemorySagaRepository;
var saga=wait repo.ShouldContainSaga(s=>s.Serial==Serial,timeout:TimeSpan.FromSeconds(1));
Assert.NotNull(saga);
//这句话的意思是:这部传奇故事处于初始状态
Assert.Equal(machine.Running.Name,repo[saga.Value].Instance.CurrentState);
}
最后
{
等待线束。停止();
}   
}

我当时运行的是dotnet core 2.1,在大量搜索和浏览Masstransit repo后,我意识到在最新的(5.3)Masstransit中有更好的依赖注入框架API,我起初不想升级到该API,以避免不得不将dotnet运行时依赖项升级到2.2

在升级之后,我开始意识到一定有一些异步问题,因为我有时会让它随机工作。然后我意识到在memrepo中有另一种方法,叫做
ShouldContainSagaInState

所以用这条线代替,我让它工作了

var saga=await repo.ShouldContainSagaInState(guid,machine,x=>x.Running,TimeSpan.FromSeconds(1));

同样,使用请求/响应模式以我想要的方式运行代码,潜在的异常会作为故障消息发送回调用方。在测试线束中,这条消息以某种方式是可用的,但我还没有找到一种正确的方法来检查它。

我创建了一个简单的活动,在IOC中注册,与您一样使用,但有一个例外:

GreenPipes.PayloadNotFoundException: The payload was not found: Automatonymous.IStateMachineActivityFactory
   at GreenPipes.PipeExtensions.GetPayload[TPayload](PipeContext context)
   at Automatonymous.Activities.ContainerFactoryActivity`3.Automatonymous.Activity<TInstance,TData>.Execute(BehaviorContext`2 context, Behavior`2 next)
   at Automatonymous.Activities.DataConverterActivity`2.Automatonymous.Activity<TInstance>.Execute[T](BehaviorContext`2 context, Behavior`2 next)
   at Automatonymous.Behaviors.LastBehavior`1.Automatonymous.Behavior<TInstance>.Execute[T](BehaviorContext`2 context)
   at Automatonymous.States.StateMachineState`1.Automatonymous.State<TInstance>.Raise[T](EventContext`2 context)
   at Automatonymous.States.StateMachineState`1.Automatonymous.State<TInstance>.Raise[T](EventContext`2 context)
   at Automatonymous.AutomatonymousStateMachine`1.Automatonymous.StateMachine<TInstance>.RaiseEvent[T](EventContext`2 context)
   at Automatonymous.Pipeline.StateMachineSagaMessageFilter`2.Send(SagaConsumeContext`2 context, IPipe`1 next)
   at MassTransit.EntityFrameworkCoreIntegration.Saga.EntityFrameworkSagaRepository`1.MassTransit.Saga.ISagaRepository<TSaga>.Send[T](ConsumeContext`1 context, ISagaPolicy`2 policy, IPipe`1 next)
GreenPipes.PayloadNotFoundException:未找到有效负载:Automatonymous.IStateMachineActivityFactory
在GreenPipes.PipeExtensions.GetPayload[TPayload](PipeContext上下文)中
在Automatonymous.Activities.ContainerFactoryActivity`3.Automatonymous.Activity.Execute(BehaviorContext`2上下文,Behavior`2下一步)
在Automatonymous.Activities.DataConverterActivity`2.Automatonymous.Activity.Execute[T](BehaviorContext`2上下文,Behavior`2下一步)
位于Automatonymous.Behaviors.LastBehavior`1.Automatonymous.Behavior.Execute[T](BehaviorContext`2上下文)
位于Automatonymous.States.StateMachineState`1.Automatonymous.State.Raise[T](EventContext`2 context)
位于Automatonymous.States.StateMachineState`1.Automatonymous.State.Raise[T](EventContext`2 context)
位于Automatonymous.AutomatonymousStateMachine`1.Automatonymous.StateMachine.RaiseEvent[T](EventContext`2 context)
在Automatonymous.Pipeline.stateMachinesGamessageFilter`2.Send处(SagaConsumeContext`2上下文,IPIPPE`1下一步)
在MassTransit.EntityFrameworkCoreIntegration.Saga.EntityFrameworkAgarePository`1.MassTransit.Saga.ISagaRepository.Send[T](ConsumeContext`1 context,ISagaPolicy`2 policy,IPipe`1 next)
我使用Masstransit 5.1.5 有什么不对劲