NServiceBus:找不到元数据(消息)

Tom*_*son 5 .net messaging nservicebus publish-subscribe

我正在尝试发布如下所示的消息

_bus.Publish(new BatchCompleted { BatchId = batch.Id});
Run Code Online (Sandbox Code Playgroud)

并在BatchCompletedHandler中处理它:

public class BatchCompletedHandler: IHandleMessages<BatchCompleted>
{

    public void Handle(BatchCompleted message)
    {
          Do Some Stuff...
    }
}
Run Code Online (Sandbox Code Playgroud)

每当我尝试发布消息时,我都会收到以下System.Exception:

找不到'MyAssembly.BatchCompleted'的元数据.消息需要实现"IMessage","IEvent"或"ICommand".或者,如果您不想实现接口,则可以配置"Unobtrusive Mode Messages"并使用约定来配置消息的映射方式.

该消息确实实现了IEvent,如下所示

[Serializable]
public class BatchCompleted : IEvent
{
    public int BatchId{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用以下代码配置NSB

Configure.With(MyAssembly)
Run Code Online (Sandbox Code Playgroud)

消息处理程序位于程序集MyAssembly中,消息位于MyMessagesAssembly中.

我究竟做错了什么?

Tom*_*son 5

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

将配置更改为

Configure.With()
Run Code Online (Sandbox Code Playgroud)

将扫描所有程序集并允许NSB查找所需的消息类型.

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


Mas*_*lce 5

在 NSB 5 中,您可以使用 AssembliesToScan 扫描所有程序集,如 NServiceBus 文档中所述: http ://docs.pspecial.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("..."));
Run Code Online (Sandbox Code Playgroud)

我希望这会有所帮助