Вызов AddConsumer с использованием универсального типа - PullRequest
0 голосов
/ 09 октября 2018

У меня проблема при использовании MassTransit v5.1.5 со стандартным DI ASP.NET Core.У меня есть следующий код:

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 голосов
/ 11 октября 2018

Здесь есть несколько неправильных вещей.

  1. Чтобы узнать, какое сообщение обрабатывать, MassTransit должен знать общий тип интерфейса потребителя.Однако вы регистрируете всех потребителей как IConsumer, что, по-видимому, неправильно.
  2. Потребители по определению изолированы от области сообщения.Таким образом, потребители создаются и располагаются для каждого сообщения и, следовательно, не могут быть одиночными.

Вам необходимо зарегистрировать своих потребителей, как описано в документации:

services.AddScoped<OrderConsumer>();

или

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

Когда потребители добавляются в набор услуг, вам также необходимо зарегистрировать шину, как показано в документации , поэтому вы используете делегата поставщика услуг:

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