C# 努力实现IFindSagas

C# 努力实现IFindSagas,c#,nservicebus,saga,C#,Nservicebus,Saga,我有一个传奇故事要讲一天 收到一条消息后,我希望找到当前的传奇,并使用Handle(message)方法进行处理 我没有配置HowtoFindsagas方法,因为我想要当前的方法(如果有的话)。在收到超时消息之前,收到的所有消息都将影响一个传奇。当前的传奇故事已经完成,并在收到新消息后创建一个新的传奇故事。但从我所读到的内容来看,我需要实现IFindSagas才能做到这一点,可能还有我自己的SagaPersister 我需要关于从哪里开始以及这是否是正确的方向的建议。代码示例会很有帮助,因为我对

我有一个传奇故事要讲一天

收到一条消息后,我希望找到当前的传奇,并使用Handle(message)方法进行处理

我没有配置HowtoFindsagas方法,因为我想要当前的方法(如果有的话)。在收到超时消息之前,收到的所有消息都将影响一个传奇。当前的传奇故事已经完成,并在收到新消息后创建一个新的传奇故事。但从我所读到的内容来看,我需要实现IFindSagas才能做到这一点,可能还有我自己的SagaPersister

我需要关于从哪里开始以及这是否是正确的方向的建议。代码示例会很有帮助,因为我对使用接口还比较陌生

   // 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");
    }
//传奇的片段
公开募捐
{
ScheduleBatchIDForSession=Guid.NewGuid();
//在Saga场景中,消息处理程序不是自动订阅的,所以它需要在这里发生。
Bus.Subscribe();
Bus.Subscribe();
Logger.Info(string.Format(“创建新传奇”);
RequestUtcTimeout(DateTime.Now.AddHours(23),“批次结束”);
}
我想我是前几天才知道的。如果你有更复杂的逻辑来查找现有的saga,那么实现IFindSagas接口,否则覆盖ConfigureHowToFindSaga方法就足够了。你需要做的就是确保配置映射到启动saga的消息。有点像这样:

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
    } 
}
公共类MySaga:Saga,我从消息开始
{
公共覆盖无效配置HowtoFindsaga()
{
配置映射(s=>s.SomeID,m=>m.SomeID);
}
公共无效句柄(Message1消息)
{
if(Data.Id!=Guid.Empty)
{
//处理现有的传奇
}
else//创建新的saga实例
{
this.Data.SomeID=message.SomeID;
RequestUtcTimeout(DateTime.Now.AddHours(23),“批次结束”);
}
//处理Message1的其余代码
}
公共覆盖无效超时(对象状态)
{
//一些商业行为
} 
}

HTH

覆盖ConfigureHowToFindSagas方法是使基础结构返回当前saga(如果有)的方式。顺便问一下,这是Run()吗方法一个你放在你的saga类上的IWantToRunAtStartup的实现?如果是的话,那就是这样做的方法。先生,你是一个传奇。这对我来说非常有意义。我有一条消息1开始了saga,很多消息2添加到它,然后是一条超时消息,结束了整个过程。非常好。再次感谢。我之前的point,如果我在saga中处理了一条消息2,我需要为它配置一个映射部分吗?是的,你需要为你的saga处理的每一条消息创建一个映射。这应该可以解释更多。这就是我的问题所在。我一次只运行一条saga,而saga ID不是由外部进程指定的。可能需要更改它。Thanks为您提供帮助。此处重定向了其他人的更新说明:语法现在是ConfigureMapping(m=>m.SomeID).ToSaga(s=>s.SomeID);