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

C# 如何使用NServiceBus部分加载处理程序?,c#,nservicebus,C#,Nservicebus,我正在运行一个控制台应用程序,其中有大量扩展的处理程序。当我运行应用程序时,我想指定命令行参数,这样只有一些处理程序将运行。我正在使用现有代码进行部分工作,因此我有点困惑,但总线似乎是这样配置的: public static BusConfiguration MyMessageConventions(this BusConfiguration config) { config.UseSerialization<JsonSerializer>(); config.Use

我正在运行一个控制台应用程序,其中有大量扩展
的处理程序。当我运行应用程序时,我想指定命令行参数,这样只有一些处理程序将运行。我正在使用现有代码进行部分工作,因此我有点困惑,但总线似乎是这样配置的:

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;
}
公共静态总线配置MyMessageConventions(此总线配置)
{
config.UseSerialization();
config.UseTransport();
config.UsePersistence();
var conventionsBuilder=config.Conventions();
conventionsBuilder.DefiningEventsAs(t=>t.Namespace!=null&&t.Namespace.StartsWith(“DE.STEP.Messages”)&&t.Namespace.EndsWith(“事件”);
返回配置;
}

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

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

config.DisableFeature<AutoSubscribe>();
config.DisableFeature();
然后,您可以单独订阅邮件:

Bus.Subscribe<MyMessage>();
Bus.Subscribe();

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

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

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

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

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


可以找到有关NServiceBus程序集扫描的文档。

现有代码的一部分是什么意思?是指实现处理程序的现有dll吗?console应用程序位于
配置
中的一个单独项目(尽管都是一个解决方案)中,该项目是一个类库,包含上述发布的代码。此外,还有其他项目也有处理程序。在其他项目中,我希望加载所有处理程序,但在我的控制台应用程序中,我只希望实际运行处理程序的一个子集,具体取决于输入的命令行参数。这是您需要的开发还是生产的业务需求?这可能是我最终要做的事情,目前,我已按接口将订阅者分组,即
ISubscriberType1
ISubscriberType2
等。然后使用
configuration.TypesToScan
有选择地加载订阅者,并提供扩展所需接口的类列表。
configuration.AssembliesToScan(myListOfAssemblies);