2011-12-14 3 views
0

У меня есть сага, которая работает в течение дня.Борьба за реализацию IFindSagas

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

У меня нет метода ConfigureHowToFindSagas, поскольку я хочу текущий, если он есть. Все полученные сообщения будут влиять на одну сагу до тех пор, пока сообщение таймаута не будет получено. Текущая сага завершается, и после получения нового сообщения создается новая. Но из того, что я прочитал, мне нужно реализовать IFindSagas, чтобы это сделать, и, возможно, мой собственный сага.

Мне нужен совет о том, с чего начать, а также если это правильный путь. Примеры кода были бы полезны, поскольку я по-прежнему относительно новичок в использовании интерфейсов.

// 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"); 
    } 
+0

приоритету метод ConfigureHowToFindSagas как вызывает инфраструктуру для возврата текущей саги (если есть один). Кстати, является ли метод Run() реализацией IWantToRunAtStartup, который вы добавили в свой сага? Если это так, это способ сделать это. –

ответ

1

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

НТН

+0

Вы, сэр, легенда. Теперь это имеет смысл для меня. У меня есть Message1, который запускает сагу, много Message2, которые добавляют к ней, а затем сообщение Timeout, которое закрывает все это. Отлично. Еще раз спасибо. – Fellmeister

+0

В дополнение к моему предыдущему моменту, если у меня есть Message2, обработанный в саге, для этого мне нужно иметь раздел ConfigureMapping? – Fellmeister

+0

Да, вам нужно сопоставление для каждого сообщения, которое обрабатывает ваша сага. Это должно объяснить больше http://www.nservicebus.com/sagas.aspx – stephenl

Смежные вопросы