使用泛型类型调用AddConsumer

时间:2018-10-09 14:06:23

标签: asp.net-core dependency-injection masstransit consumer

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

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());
    });
};

但这对我也不起作用。

1 个答案:

答案 0 :(得分: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>());