2013-09-24 10 views
5

私はNServiceBus:(メッセージ)のためのメタデータが見つかりませんでした

_bus.Publish(new BatchCompleted { BatchId = batch.Id}); 

下に示すようにメッセージを公開しBatchCompletedHandlerでそれを処理しようとしています:私がしようとするたびに

public class BatchCompletedHandler: IHandleMessages<BatchCompleted> 
{ 

    public void Handle(BatchCompleted message) 
    { 
      Do Some Stuff... 
    } 
} 

と公開私は次のSystem.Exceptionを取得するメッセージ:

'MyAssembly.BatchCompleted'のメタデータが見つかりませんでした。メッセージは、 'IMessage'、 'IEvent'、または 'ICommand'のいずれかを実装する必要があります。また、インターフェースを実装したくない場合は、「目立たないモードのメッセージ」を設定して、メッセージのマッピング方法を設定することができます。

[Serializable] 
public class BatchCompleted : IEvent 
{ 
    public int BatchId{ get; set; } 
} 

以下のように

メッセージは、私はメッセージハンドラがアセンブリMyAssemblyであるとのメッセージがあり、次のコード

Configure.With(MyAssembly) 

を使用してNSBを設定していますIEventを実装しませんMyMessagesAssemblyにあります。

私は間違っていますか?

+0

設定を投稿できますか? UnicastBusConfig、メッセージマッピングは適切に設定されていますか?あなたのメッセージアセンブリは同じ.netバージョンを使用していますか?つまり、.net 4.0とあなたのメッセージ.net 4.5を使用してあなたのハンドラですか? –

+0

ありがとうIndu、ポインタです。それは問題を引き起こした構成でした! –

答えて

5

NServiceBusは、使用されているメッセージタイプを見つけることができません。メッセージは別のアセンブリにありますが、NSBはバイナリフォルダ内のすべてのアセンブリをスキャンするデフォルトの動作ではなく、指定されたアセンブリ(MyAssembly)のみをスキャンします。

すべてのアセンブリをスキャンし、NSBが必要なメッセージの種類を見つけることができるようになります

Configure.With() 

に設定を変更します。

私はエラーメッセージが少し誤解を招くと思います!

config.Conventions() 
      .DefiningCommandsAs(t => t.Namespace != null && t.Namespace.StartsWith("...")) 
      .DefiningEventsAs(t => t.Namespace != null && t.Namespace.StartsWith("...")) 
      .DefiningMessagesAs(t => t.Namespace != null && t.Namespace.StartsWith("...")); 

私は願っています:あなたが名前空間の規則を指定した場合 http://docs.particular.net/nservicebus/hosting/assembly-scanning

は、すべてのルールが正しいことを確認してください:NServiceBusドキュメントで説明したように

2

NSB 5では、あなたはAssembliesToScanを使用してすべてのアセンブリをスキャンすることができますこれは役に立ちます

関連する問題