未调用NServicebus通用消息处理程序

本文关键字:消息处理 程序 调用 NServicebus | 更新日期: 2023-09-27 18:28:43

我目前正在开发一个示例项目,在该项目中,我在后端使用NServiceBus来发布事件。后端应该通过一组处理程序来处理自己的事件。当我为每个事件实现一个特定的处理程序时,这很好,如下所示:

public sealed class MyEventHandler : IHandleMessages<MyEvent> { }
public sealed class OtherEventHandler : IHandleMessages<OtherEvent> { }

然而,由于这些处理程序只是将事件分派给另一个处理器,所以我想清理一下,只实现一个通用的消息处理程序:

public sealed class GenericHandler : IHandleMessages<object> { }

遗憾的是,泛型处理程序仅对项目中存在另一个特定处理程序的消息类型调用。换句话说,当我将MyEventHandler留在源中时,GenericHandler会正确地接收MyEvent事件,但当我删除此(现已过时)处理程序时,它会停止接收此消息。事实上,我的目标是从项目中删除所有特定的处理程序,并且只使用单个GenericHandler。我是否缺少配置中的一个基本步骤?

NServiceBus配置如下所示:

<UnicastBusConfig>
  <MessageEndpointMappings>
    <add Assembly="Kingo.Samples.Chess.Api" Endpoint="kingo.samples.chess" />      
  </MessageEndpointMappings>
</UnicastBusConfig>

此外:

  • 上面提到的Api程序集包含所有需要发布和处理的事件
  • 我使用NServiceBus的ICommandIEvent标记接口标记了所有消息
  • 我将NServiceBusV5(Core)与NServiceBus.HostV6结合使用
  • 我在EndpointConfig中有以下自定义总线配置:

    void IConfigureThisEndpoint.Customize(BusConfiguration configuration)
    {                                     
        configuration.AssembliesToScan(GetAssembliesToScan("*Chess.Api.dll", "*Chess.dll"));            
        configuration.UsePersistence<InMemoryPersistence>();
        configuration.UseContainer<UnityBuilder>();
        configuration.UseSerialization<JsonSerializer>();
        configuration.Conventions().DefiningEventsAs(type => type.Name.EndsWith("Event"));
    }
    

未调用NServicebus通用消息处理程序

您的配置将事件定义为以"event"结尾的任何类。"对象"不符合此条件,因此您不会在通用处理程序中收到消息。

您需要使用IEvent:

public sealed class GenericHandler : IHandleMessages<IEvent> { }