2010-12-20 7 views
1

同じメッセージを扱う2つの異なるサガ(私はサガタイプを意味します)を持っています。同じメッセージタイプを扱う2つのサガを持つことはできません

 public class AttachMessageToBugSaga : TpSaga<AttachMessageToBugSagaData>, IAmStartedByMessages<MessageIsNotAttached>, IHandleMessages<MessageAttachedToGeneralMessage> 
    { 
     public override void ConfigureHowToFindSaga() 
     { 
      ConfigureMapping<MessageAttachedToGeneralMessage>(
      saga => saga.Id, 
      message => message.SagaId 
      ); 
     } 
     public void Handle(MessageIsNotAttachedToBug message) 
     { 
      Send(new AttachMessageToGeneralCommand { MessageId = 66, GeneralId = 13 }); 
     } 

     public void Handle(MessageAttachedToGeneralMessage message) 
     { 
      //do some stuf fhere 
     } 
    } 

    public class AttachMessageToBugSagaData : IContainSagaData 
    { 
     public Guid Id { get; set; } 
     public string Originator { get; set; } 
     public string OriginalMessageId { get; set; } 
    } 

    public class AttachMessageToRequestSaga : TpSaga<AttachMessageToRequestSagaData>, IAmStartedByMessages<MessageIsNotAttachedToRequest>, IHandleMessages<MessageAttachedToGeneralMessage> 
    { 
     public override void ConfigureHowToFindSaga() 
     { 
      ConfigureMapping<MessageAttachedToGeneralMessage>(
      saga => saga.Id, 
      message => message.SagaId 
      ); 
     } 

     public void Handle(MessageIsNotAttachedMessageToRequest message) 
     { 
      //do some stuff here 
     } 

     public void Handle(MessageAttachedToGeneralMessage message) 
     { 
      //do some stuff here 
     } 
    } 

    public class AttachMessageToRequestSagaData : IContainSagaData 
    { 
     public Guid Id { get; set; } 
     public string Originator { get; set; } 
     public string OriginalMessageId { get; set; } 
    } 

私は例外を取得サンプルを実行します。

System.InvalidCastExceptionの:型のオブジェクトをキャストすることができません「をMyCustomPlugin.AttachMessageToGeneralSagaData」「MyCustomPlugin.AttachMessageToRequestSagaData」と入力します。

なぜ起こったのか理解していますが、まだ解決策が必要です。

public class SagaFinder : IFindSagas<AttachMessageToGeneralSagaData>.Using<MessageAttachedToGeneralMessage>, 
IFindSagas<AttachMessageToRequestSagaData>.Using<MessageAttachedToGeneralMessage>, 
IFindSagas<AttachMessageToRequestSagaData>.Using<MessageIsNotAttachedToRequest>, 
IFindSagas<AttachMessageToRequestSagaData>.Using<MessageIsNotAttachedToBug> 
{ 
    AttachMessageToGeneralSagaData IFindSagas<AttachMessageToGeneralSagaData>.Using<MessageAttachedToGeneralMessage>.FindBy(MessageAttachedToGeneralMessage message) 
    { 
     return ObjectFactory.GetInstance<AttachMessageToGeneralSagaData>(); 
    } 

    AttachMessageToRequestSagaData IFindSagas<AttachMessageToRequestSagaData>.Using<MessageAttachedToGeneralMessage>.FindBy(MessageAttachedToGeneralMessage message) 
    { 
     return ObjectFactory.GetInstance<AttachMessageToRequestSagaData>(); 
    } 

    public AttachMessageToRequestSagaData FindBy(MessageIsNotAttachedToRequest message) 
    { 
     return new AttachMessageToRequestSagaData(); 
    } 

    public AttachMessageToRequestSagaData FindBy(MessageIsNotAttachedToBug message) 
    { 
     return new AttachMessageToRequestSagaData(); 
    } 
} 

しかし、私は「MessageAttachedToGeneralMessage」のための私のファインダーに得ることはありません:私は私自身のIFindSagasクラスを実装しようとしました。 他の回避策がある場合や、この例を動作させる方法がある場合は教えてください。

答えて

0

最後に(ソースコードを掘り下げた後)私は解決策を見つけました。唯一の方法は、自分のSagaPersisterを実装することです。ここで私は何でもできることができます。 InMemorySagaPersisterのNserviceBusで

デフォルトの実装では、次のコードがあります

T ISagaPersister.Get<T>(Guid sagaId) 
    { 
     ISagaEntity result; 
     data.TryGetValue(sagaId, out result); 

     return (T)result; 
    } 

を、鋳造中に例外が発生します。

2

同じプロセス境界内に複数の佐賀を持つことがうまく機能するかどうかはわかりません。少なくとも、私も問題がありました。いずれにしても、Sagaストレージに多くのロックやデッドロックが発生する可能性があるため、Sagasを2つの異なるプロセスに分ける方が良いでしょう(一般的には)。

あなたのメッセージは、2 Sagas SentまたはPublishedによって処理されますか?それが公開されていれば、Sagasを2つの別々のアセンブリに分けるのは簡単です。 Sagasはapp.configにリストされているメッセージに自動購読しないので、各Sagaのメッセージタイプに対して手動でBus.Subscribe()を手動で呼び出すようにしてください。

あなたのメッセージが送信され、それを変更するために何もできない場合は、既存のメッセージタイプ用の中央ハンドラを作成して、Sagasに行くための2番目のメッセージタイプを公開するか、サガ。

+0

あなたの答えDavidに感謝します。なぜ私はSagasを別のプロセスに分ける方が良いのか分かりません。 1つのNServiceBusHost.exeプロセスでたくさんのサガを実行しています。そして私は小さな論理的な部分に私の流れを分けるのに彼らの多くが必要です。だから私はステートマシンのようなものを持っています。ステートマシーンは新しいステートに切り替えるのに役立ちます。しかし私はあなたの考えを理解しています。それは動作するはずです – struhtanov

関連する問題