2013-09-24 25 views
5

Sto tentando di pubblicare un messaggio come mostrato di seguitoNServiceBus: Impossibile trovare i metadati per (messaggio)

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

E gestirlo in un BatchCompletedHandler:

public class BatchCompletedHandler: IHandleMessages<BatchCompleted> 
{ 

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

Ogni volta che provo e pubblicare il messaggio Ho ottenuto il seguente System.Exception:

Impossibile trovare i metadati per "MyAssembly.BatchCompleted". I messaggi devono implementare "IMessage", "IEvent" o "ICommand". In alternativa, se non si desidera implementare un'interfaccia, è possibile configurare "Messaggi in modalità non intrusiva" e utilizzare la convenzione per configurare la modalità di mappatura dei messaggi.

Il messaggio fa attuare iEvent come illustrato di seguito

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

Sto configurando NSB utilizzando il seguente codice

Configure.With(MyAssembly) 

Il gestore di messaggi è in assemblea MyAssembly ei messaggi sono nel MyMessagesAssembly.

Cosa sto sbagliando?

+0

Puoi pubblicare la tua configurazione? Il tuo UnicastBusConfig, i mapping dei messaggi sono configurati in modo appropriato? Il tuo gruppo di messaggi usa la stessa versione .net? cioè il tuo gestore utilizza .net 4.0 ei tuoi messaggi a .net 4.5? –

+0

Grazie Indu, per il puntatore. Era la configurazione a causare il problema! –

risposta

5

NServiceBus non riesce a trovare il tipo di messaggio utilizzato. I messaggi si trovano in un assembly separato ma la configurazione fa in modo che NSB esegua solo la scansione dell'assembly specificato (MyAssembly) anziché il comportamento predefinito di scansione di tutti gli assembly nella cartella dei file binari.

Modifica della configurazione di

Configure.With() 

esplorerà tutte le assemblee e permettere NSB per trovare i tipi di messaggio richiesti.

Penso che il messaggio di errore sia un po 'fuorviante!

2

In NSB 5 è possibile eseguire la scansione di tutti i gruppi che utilizzano AssembliesToScan come spiegato nel NServiceBus doc: http://docs.particular.net/nservicebus/hosting/assembly-scanning

Se hai specificato namespace convenzioni, assicurarsi che tutte le regole siano corrette:

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("...")); 

spero questo sarà utile