Изо всех сил, чтобы реализовать IFindSagas - PullRequest
0 голосов
/ 14 декабря 2011

У меня есть сага, которая работает в течение дня.

Получив сообщение, я хочу найти активную сагу и сделать что-то в методе Handle (message).

У меня нет метода ConfigureHowToFindSagas, так как я хочу текущий, если он есть.Все полученные сообщения будут влиять на одну сагу, пока не будет получено сообщение об истечении времени ожидания.Текущая сага завершается, и при получении нового сообщения создается новая.Но из того, что я прочитал, мне нужно реализовать 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");
    }

1 Ответ

1 голос
/ 14 декабря 2011

Я думаю, что просто ответил на аналогичный вопрос на днях. Если у вас есть более сложная логика для поиска существующей саги, тогда реализуйте интерфейс IFindSagas, в противном случае достаточно будет переопределить метод 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
    } 
}

НТН

...