7

我正在尝试发布一条消息,如下所示

_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; }
}

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

Configure.With(MyAssembly)

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

我究竟做错了什么?

4

2 回答 2

5

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

将配置更改为

Configure.With()

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

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

于 2013-09-30T09:12:31.090 回答
5

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

我希望这会有所帮助

于 2016-09-14T09:57:47.773 回答