如何使用 NServiceBus 部分加载处理程序?

How can I partially load handlers with NServiceBus?

我正在 运行 开发一个控制台应用程序,其中有大量扩展 <IHandleMessages> 的处理程序。当我 运行 应用程序时,我想指定命令行参数,这样只有一些处理程序会 运行ning。我正在部分使用现有代码,所以我有点困惑,但总线似乎是这样配置的:

public static BusConfiguration MyMessageConventions(this BusConfiguration config)
{
    config.UseSerialization<JsonSerializer>();
    config.UseTransport<RabbitMQTransport>();
    config.UsePersistence<InMemoryPersistence>();

    var conventionsBuilder = config.Conventions();
    conventionsBuilder.DefiningEventsAs(t => t.Namespace != null && t.Namespace.StartsWith("DE.STEP.Messages") && t.Namespace.EndsWith("Events"));
    return config;
}

这就是它的全部内容,据我所知,这使我不必实现 IMessage 接口。现在,正如我所见,NServiceBus 将扫描我的控制台项目中的所有处理程序,所以我想知道如何将它配置为不这样做(同时保留所有其他行为),并且只加载我指定的处理程序?

听起来你想关闭自动订阅:

config.DisableFeature<AutoSubscribe>();

然后您可以单独订阅消息:

Bus.Subscribe<MyMessage>();

您可能希望在启动时先取消订阅所有消息 (Bus.Unsubscribe),然后重新订阅您感兴趣的消息。否则您的订阅仍将存在于上次您 运行 应用程序。

最简单的解决方案是将您的消息和处理程序拆分到多个项目中。通常在像您这样的场景中,这些 messages/handlers 组之间存在某种逻辑分离,您希望通过配置(或命令行)参数控制这些组。

NServiceBus 扫描它在应用程序文件夹中找到的所有程序集,以查找所有处理程序和其他标记接口。您可以使用 (V5):

限制程序集列表
configuration.AssembliesToScan(myListOfAssemblies);

您可以根据您的配置参数构建程序集列表。如果您有不同的部署,您希望在其中使用不同的处理程序集,您可以只部署在该特定安装中需要的那些程序集。

您可以为您的消息使用一个程序集或一组程序集,这些程序集使用您的 DefiningEventsAs 调用进行配置,并为处理程序提供单独的程序集。

关于NServiceBus程序集扫描的文档可以找到here