2013-09-04 3 views
0

У меня есть две саги - это сага клиента и сага о биллинге клиентов.Nservice bus saga ordering

public class ClientSagaState:IContainSagaData 
    { 
     #region NserviceBus 
     public Guid Id { get; set; } 
     public string Originator { get; set; } 
     public string OriginalMessageId { get; set; } 
     #endregion 

     public Guid ClientRef { get; set; } 

     public ClientMessage ClientChangeMessage { get; set; } 

     public ClientContactChangeMessage ClientContactChange { get; set; } 


    } 

     public class ClientBillingSagaState:IContainSagaData 
    { 
     #region NserviceBus 
     public Guid Id { get; set; } 
     public string Originator { get; set; } 
     public string OriginalMessageId { get; set; } 
     #endregion 

     public Guid ClientRef { get; set; } 

     public Guid FunderRef { get; set; } 

     public Guid ClientBillingRef { get; set; } 

     public ClientBillingMessage ClientBillingMessage { get; set; } 


    } 

    public class ClientSaga:Saga<ClientSagaState>, 
    IAmStartedByMessages<ClientChangeMessage>, 
     IAmStartedByMessages<ClientContactChangeMessage> 
    { 

    public override void ConfigureHowToFindSaga() 
     { 

      ConfigureMapping<ClientChangeMessage>(s => s.ClientRef, m => m.EntityRef); 
      ConfigureMapping<ClientContactChangeMessage>(s => s.ClientRef, m => m.PrimaryEntityRef); 
     } 

    public void Handle(ServiceUserChangeMessage message) 
     { 

      if (BusRefTranslator.GetLocalRef(EntityTranslationNames.ClientChange, message.EntityRef.Value) != null) 
      { 

       GetHandler<ClientChangeMessage>().Handle(message); 
       CompleteTheSaga(); 
       return; 
      } 
      HandleServiceUserChangeAndDependencies(message); 
      //MarkAsComplete(); 
      CompleteTheSaga(); 
     } 

    } 

    public class ClientBillingSaga:Saga<ClientBillingSagaState> 
     ,IHandleMessages<ClientChangeMessage>, 
     IAmStartedByMessages<ClientBillingMessage>, 
     IHandleMessages<FunderChangeMessage> 
    { 

     public override void ConfigureHowToFindSaga() 
     { 

      ConfigureMapping<ClientChangeMessage>(s => s.ClientRef, m => m.EntityRef); 
      ConfigureMapping<FunderChangeMessage>(s => s.FunderRef, m => m.EntityRef); 
      ConfigureMapping<ClientBillingMessage>(s => s.ClientBillingRef, m => m.PrimaryEntityRef); 

     } 

     public void Handle(ClientChangeMessage message) 
     { 
      var state = this.Data; 
      if (state.ClientBillingMessage != null) 
      { 
       Handle(state.ClientBillingMessage); 
      } 
     } 

      public void Handle(CareSysInvoiceLineInsertMessage message) 
      { 

       //First check for the funder 
       //If funder is not there store the message in saga 

       //If funder is there then check for client 
       //If client is not there then put the message in saga 

       // if funder and client are there then execute the message delete the saga 
      } 


    } 

Вот сценарий:

1) Если я получить ClientBillingMessage которого клиент и спонсорам не там, я хранить это сообщение в саге.

2) Если теперь сообщение финансирующего приходит тогда он запускается на выполнение, но сага все еще сохраняется, как он ожидает сообщения клиента

3) Теперь, если сообщение приходит клиента он работает клиентский обработчик сообщений в ClientBillingSaga первым, следовательно, уже существующий ClientBillingSaga по-прежнему сохраняется, и после этого он идет и выполняет обработчик внутри сообщения ClientSaga для клиента.

Мой вопрос: Есть ли способ, которым я могу заказать исполнение этих двух саг. Я нашел интерфейс ISpecifyMessageHandlerOrdering, который занимается обработкой сообщений, но я не думаю, что могу использовать его для саги.

ответ

0

Саги предназначены для синхронизации событий с течением времени.

Вы можете собирать данные, которые вам нужны, из сообщений, которые вы обрабатывали в состоянии саги, и после того, как вы обработали все, затем приступите к отправке команды/публикации события, чтобы бизнес-логика могла обрабатываться обработчиком.

Примечание: фактическая работа (бизнес-логика и манипуляция данными с областями) должна выполняться в отдельном обработчике (в соответствии с SRP и единицей работы).

надеюсь, что это помогает

0

Я думаю, что вы не должны заказывать выполнение двух сагах. Сага должна быть автономной, действуя исключительно на сообщения, которые она получает, имеет внутреннее состояние и либо отправляет сообщения, либо завершается. Если вы действительно хотите взаимодействовать с другой сагой, вы должны использовать сообщения (команды/события).

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