Вы не можете решить эту проблему, не меняя сагу и, вероятно, сообщения, которые направляются по системе клиента.
Ваша проблема заключается в том, что сага, вероятно, сконфигурирована для запуска по получении определенного типа сообщения, которое генерируется клиентским приложением каждый раз, когда пользователь вносит изменения клиенту.
Назовёх это сообщение:
public class ClientTypedSomethingAboutCustomer
{
int CustomerId {get;set;}
...
}
Ваша сага будет настроить что-то вроде этого:
public class CustomerSaga : Saga<CustomerSagaData>, IAmStartedByMessages<ClientTypedSomethingAboutCustomer>
{
public override void ConfigureHowToFindSaga()
{
ConfigureMapping<ClientTypedSomethingAboutCustomer>
(message => message.CustomerId).ToSaga(saga => saga.CustomerId);
...
}
...
}
Это приводит к тому, саге быть инициализируются и значение идентификатора клиента, установленное в реализации IContainSagaData , для каждого полученного сообщения клиента.
Чтобы решить проблему дальнейших сообщений инициализации новых саг, вы можете создать другой тип сообщения, чтобы различать, когда кто-то начинает печатать что-то о клиенте, а затем типы что-то еще об этом клиента.
Что-то вроде:
public class ClientTypedSomethingElseAboutCustomer
{
int CustomerId {get;set;}
...
}
Тогда ваша сага будет выглядеть следующим образом:
public class CustomerSaga : Saga<CustomerSagaData>, IAmStartedByMessages<ClientTypedSomethingAboutCustomer>
,IHandleMessages<ClientTypedSomethingElseAboutCustomer>
{
public override void ConfigureHowToFindSaga()
{
ConfigureMapping<ClientTypedSomethingAboutCustomer>
(message => message.CustomerId).ToSaga(saga => saga.CustomerId);
ConfigureMapping<ClientTypedSomethingElseAboutCustomer>
(message => message.CustomerId).ToSaga(saga => saga.CustomerId);
}
...
}
Это гарантирует, что все сообщения о клиенте будет перенаправлен к одному экземпляру саг.
Возможно, возможно получить приблизительное поведение в очереди, запустив NServiceBus в однопоточном режиме. Это может ограничить создание параллельных саг для клиента, но я не хотел бы полагаться на это.
Не могли бы вы сделать свой уникальный атрибут идентификатором клиента? Если это так, вы можете позволить сообщению, которое начинает сагу, также отображаться и обрабатываться сагой. Таким образом, если запущена сага с идентификатором клиента 1 и поступит новое сообщение (обновление, полученное для клиента 1), результат будет обрабатываться одной сагой. Если это не сработает, не могли бы вы предоставить короткие фрагменты кода о ваших отображениях саги + сообщение инициализации. –