2013-09-24 34 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'。另外,如果你不想实现一个接口,你可以配置'Unobtrusive Mode Messages',并使用约定来配置消息的映射方式。

消息实施IEvent如下所示

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

我使用以下代码

Configure.With(MyAssembly) 

消息处理程序是在MyAssembly程序的组件和消息是配置NSB在MyMessagesAssembly中。

我在做什么错?

+0

你能发布你的配置吗?您的UnicastBusConfig,消息映射是否已正确配置?您的邮件汇编是否使用相同的.net版本?即您的处理程序是否使用.net 4.0,而您的消息是.net 4.5? –

+0

感谢Indu,指针。这是导致问题的配置! –

回答

5

NServiceBus无法找到正在使用的消息类型。这些消息位于单独的程序集中,但配置会导致NSB仅扫描指定的程序集(MyAssembly),而不是扫描二进制文件夹中所有程序集的默认行为。

更改配置到

Configure.With() 

将扫描所有组件和允许NSB找到所需要的消息类型。

我认为错误信息有点误导!

2

在NSB 5,你可以使用扫描AssembliesToScan所有组件在NServiceBus DOC解释说: http://docs.particular.net/nservicebus/hosting/assembly-scanning

如果您指定的命名惯例,确保所有的规则是正确的:

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

希望这将有帮助