努力实现IFindSagas

本文关键字:IFindSagas 实现 努力 | 更新日期: 2023-09-27 18:17:41

我有一个长达一天的传奇故事。

在收到消息后,我想找到活动的saga并在Handle(message)方法中做一些事情。

我没有一个ConfigureHowToFindSagas方法,因为我想要当前的一个,如果有一个。在收到超时消息之前,接收到的所有消息都将影响一个saga。当前的传奇完成,并在接收到新消息时创建一个新的传奇。但是从我所读到的,我需要实现IFindSagas,以便做到这一点,并可能实现我自己的Saga持久性。

我需要建议从哪里开始,如果这是正确的方式去。代码示例将是有帮助的,因为我仍然是使用接口的新手。

   // fragment from Saga<PaymentSagaBase>
 public void Run()
        {
        ScheduleBatchIDForSession = Guid.NewGuid();
        // Message handlers aren't auto-subscribed in Saga scenarios so it needs to happen here.
        Bus.Subscribe<PaymentRequested>();
        Bus.Subscribe<PaymentCancelled>();
        Logger.Info(string.Format("Creating new Saga.");
        RequestUtcTimeout(DateTime.Now.AddHours(23), "End of batch");
    }

努力实现IFindSagas

我想我前几天刚刚回答了一个类似的问题。如果您有更复杂的逻辑来查找现有的传奇,那么实现ifindsaga接口,否则覆盖ConfigureHowToFindSaga方法就足够了。您所需要做的就是确保配置映射到启动传奇的消息。像这样:

public class MySaga : Saga<MySagaData>, IAmStartedByMessages<Message1>
{
    public override void ConfigureHowToFindSaga()
    {
         ConfigureMapping<Message1>(s => s.SomeID, m => m.SomeID);
    }
    public void Handle(Message1 message)
    {
       if(Data.Id != Guid.Empty)
       {
           // handle existing saga
       }
       else // create new saga instance
       {
          this.Data.SomeID = message.SomeID;
          RequestUtcTimeout(DateTime.Now.AddHours(23), "End of batch");
       }
        // rest of the code to handle Message1
    }
    public override void Timeout(object state)
    {
        // some business action
    } 
}

HTH