AutofacRegistrationExtensions.ConfigureConsumers(IComponentContext) 按约定注册接收端点

AutofacRegistrationExtensions.ConfigureConsumers(IComponentContext) Register Receive Endpoints by Convention

我正在尝试按照约定 (在 MT v6.0 中) 注册接收端点,但是这样做时永远不会调用它们的 Consume() 方法。如果我通过设置 ReceiveEndpoint() 手动注册,那么它就可以工作,但理想情况下,我能够按照惯例执行此操作,因为总线连接发生在基础 class 中并且自动发现很好。

不清楚 ConfigureEndpoints(IComponentContext) 所依赖的命名约定是什么,我不确定默认行为是否适用于队列名称本身或消费者的名称 class。有几点想法:

  1. 如果默认约定适用于消费者 class 名称,这似乎没有意义,因为 classes 可以通过 IConsumer<T> 的实现来识别,其中 T 是队列消息。默认情况下,行为应该是发现和连接任何实现 IConsumer<T>.
  2. 的东西
  3. 如果约定适用于队列名称,这意味着队列名称必须与 T 匹配,这更有意义,但在我的情况下,我的队列和 T 都是 "IFileReceived" 并且队列中有一条消息,但 Consume( ) 仍然没有被调用.. 所以也许约定依赖于一个完全命名空间的 T,即 MyNamespace.IFileReceived 作为队列名称?如果是这样,那就有问题了。

我的消费者 class 肯定是在 Autofac 容器中注册的,我可以在 Registrations 集合中看到它,所以看来我的问题是由于命名约定或其他原因造成的。有任何想法吗?不幸的是,我在网上找不到任何关于按照惯例注册接收端点的信息。

new ContainerBuilder().AddMassTransit(x => 
{
    x.AddConsumers(Assembly.GetCallingAssembly());

    x.AddBus(bus => MassTransit.Bus.Factory.CreateUsingRabbitMq(config =>
    {
        config.Host(new Uri(serviceBusHost), h =>
        {
            h.Username(serviceBusUsername);
            h.Password(serviceBusPassword);
        });

        config.ConfigureEndpoints(bus);

    }));
});

问题是由于:

x.AddConsumers(Assembly.GetCallingAssembly());

我希望我的消费者在 GetCallingAssembly() 返回的程序集中,而实际上程序集是 MassTransit.AutofacIntegration。将行更改为以下内容修复了问题:

x.AddConsumers(Assembly.GetEntryAssembly());

令人困惑的部分是传递到以下内容的 IComponentContext 实际上包含我的订阅者,但仅此还不够好。消费者必须通过 AddConsumers() 调用发现:

config.ConfigureEndpoints(bus);

从 Autofac/DI 的角度来看,总线变量包含我的订户,但不是从 MassTransit 的角度来看。