使用泛型类型调用AddConsumer

问题描述 投票:1回答:1

当我使用MassTransit v5.1.5和默认的ASP.NET Core DI时,我遇到了问题。我有以下代码:

var consumers = typeof(CompanyApplicationService).Assembly
            .GetTypes()
            .Where(t => typeof(IConsumer).IsAssignableFrom(t))
            .ToList();

        consumers.ForEach(
            c => services.AddSingleton(typeof(IConsumer), c));

        cqrsConfig.ServiceCollectionConfig = (x) =>
        {
            consumers.ForEach(consumer => x.AddConsumer<consumer>());
        };

所以我有一个单独的程序集,我的IConsumer<T>实现。我将这些消费者加载到列表中,但是当我尝试使用MassTransit.ExtensionsDependencyInjectionIntegration.IServiceCollectionConfigurator.AddConsumer<T>()方法添加它们时,我无法传递我之前加载的类型。那有什么想法吗?

我试图注册消费者,如:

cqrsConfig.InMemoryBusConfig = (c) =>
{
    var host = c.Host;

    c.ReceiveEndpoint(busName, ep =>
    {                    
         ep.LoadFrom(services.BuildServiceProvider());
    });
};

但这对我也不起作用。

asp.net-core dependency-injection masstransit consumer
1个回答
0
投票

这里有不止一件事是错的。

  1. 为了知道要处理哪条消息,MassTransit需要知道消费者的通用接口类型。但是,您将所有消费者注册为IConsumer,这显然是错误的。
  2. 根据定义,消费者被隔离到消息范围。因此,消费者被实例化并处理每个消息,因此,不能是单身人士。

您需要像文档中描述的那样注册您的消费者:

services.AddScoped<OrderConsumer>();

要么

services.AddMassTransit(x =>
{
     x.AddConsumer<OrderConsumer>();
});

当消费者被添加到服务集合中时,您还需要注册documentation中显示的总线,因此您使用服务提供者委托:

services.AddSingleton(provider => Bus.Factory.CreateUsingRabbitMq(cfg =>
{
    var host = cfg.Host("localhost", "/", h => { });

    cfg.ReceiveEndpoint(host, "submit-order", e =>
    {
        e.LoadFrom(provider);
    });
}));


services.AddSingleton<IBus>(provider => provider.GetRequiredService<IBusControl>());
© www.soinside.com 2019 - 2024. All rights reserved.