これは、saga と、おそらくクライアント システムによって送信されているメッセージを変更せずに解決することはできません。
問題は、ユーザーが顧客に変更を加えるたびに、クライアント アプリケーションによって生成される特定のメッセージ タイプの受信時にサガが開始されるように構成されている可能性があることです。
このメッセージを呼び出しましょう:
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 実装で Customer ID 値が設定されます。
新しいサガを初期化する追加のメッセージの問題を解決するには、別のメッセージ タイプを作成して、誰かが顧客について何かを入力し始め、次にその顧客について別のことを入力するタイミングを区別することができます。
何かのようなもの:
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);
}
...
}
これにより、顧客に関するすべてのメッセージが単一の saga インスタンスにルーティングされるようになります。
NServiceBus をシングル スレッド モードで実行することにより、おおよそのキューイング動作を実現できる場合があります。これにより、顧客の同時サガの作成が制限される可能性がありますが、これに依存したくありません。