2015-12-22 2 views
2

Что было бы правильным способом, чтобы все сообщения обрабатывались одной сагой?Singleton NServiceBus Saga

Я не думаю, что не могу указать некоторую корреляцию message-to-saga. Могу я? Я считаю, что это приведет к ошибке «сага не найдена».

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

class SomePolicy : 
    Saga<SomePolicy.State>, 
    IAmStartedByMessages<SomeEvent> 
{ 
    internal class State : ContainSagaData 
    { 
     public int Id { get { return 1; } } 
    } 

    protected override void ConfigureHowToFindSaga(SagaPropertyMapper<State> mapper) 
    { 
     mapper 
      .ConfigureMapping<SomeEvent>(message => message.MagicConstant) 
      .ToSaga(saga => saga.Id); 
    } 

    public void Handle(SomeEvent message) 
    { 
     // Modify the saga state here. 
    } 
} 
+1

Зачем вам это нужно? –

+1

Это выглядит правильно (не запускал код), в чем проблема? Что вы пытаетесь сделать? –

+0

@TomRedfern, скажем, я хочу объединить некоторую глобальную информацию, например, сколько раз определенные события происходят в системе, я мог бы использовать саунд-синглтон, чтобы получать все эти события, увеличивать счетчик и выполнять действие, когда счетчик достигает определенного порог. – izildur

ответ

1

Вместо переопределения ConfigureHowToFindSaga вы можете поставить реализацию IFindSagas<T>.Using<M>, который используется, чтобы найти сагу типа Т из сообщения типа М. Тогда просто всегда возвращает тот же экземпляр.

См. Complex Saga Finding Logic для получения более подробной информации и некоторых образцов.