MassTransit and.NET Core DI-как разрешить зависимости с помощью конструктора без параметров?

Я работаю над приложением, используя .NET Core 2 и MassTransit 4(dev).

общественный транспорт требует конструктора без параметров для потребителей. Мне нужно использовать, например, logger, dbContext и т. д. В моих потребителях, и я хотел бы продолжать использовать собственный DI из .NET Core, поэтому я предпочел бы не добавлять Autofac и т. д. (Если возможно?). Это вызывает проблему, когда .NET Core DI не может ввести мои deps, потому что мой потребитель создается с помощью конструктора без параметров...

есть ли какой-либо способ для разрешения зависимостей с помощью собственного net core DI при наличии конструктора без параметров или есть какой-то способ объявления конечных точек MassTransit, который позволил бы сделать это, кроме стандартного:

sbc.ReceiveEndpoint(host, Configuration["QueueName"], 
                    e => { e.Consumer<MyAwesomeConsumer>();});

я пробовал:

// =========== MASS TRANSIT ===============
            var serviceProvider = services.BuildServiceProvider();
            services.AddSingleton<MyAwesomeConsumer, MyAwesomeConsumer>();
            var bus = Bus.Factory.CreateUsingRabbitMq(sbc =>
            {
                var host = sbc.Host(new Uri("rabbitmq://localhost"), h =>
                {
                    h.Username("guest");
                    h.Password("guest");
                });

                sbc.ReceiveEndpoint(host, Configuration["QueueName"],
                    e =>
                    {
                        e.Consumer(typeof(MyAwesomeConsumer), serviceProvider.GetService);
                    });
            });

приложение поднимается, но как только приходит первое сообщение, я получаю сообщение об ошибке:MassTransit.ConsumerException: Unable to resolve consumer type 'AuthService.Integrations.MyAwesomeConsumer'.

Я буду признателен за любую помощь. Надеюсь, понятно, о чем я спрашиваю.

1 ответов


если вы используете Microsoft.Extensions.DependencyInjection container (который по умолчанию с ASP.NET Core), тогда вам понадобится MassTransit.Extensions.DependencyInjection пакет для MassTransit. Обратите внимание, что пакет в настоящее время доступен только в качестве предварительной версии, а также требует предварительной версии MassTransit. Кроме того, новый пакет является частью массовая миграция для .NET Standard, который все еще не завершен, поэтому вы, вероятно, должны быть немного осторожны, так как, вероятно, будет довольно много движущихся частей до финального релиза.

поскольку пакет официально не выпущен, на нем пока нет никакой документации. Но от взгляда на запрос pull, который ввел его и источник, Я думаю, что вам нужно сделать, это следующее:

на Startup.ConfigureServices, вам нужно добавить MassTransit, так же, как вы добавили бы другие услуги:

services.AddMassTransit(c =>
{
    c.AddConsumer<MyConsumer>();
    c.AddConsumer<MyOtherConsumer>();

    // or sagas
    c.AddSaga<MySaga>();
});

// you still need to register the consumers/sagas
services.AddScoped<MyConsumer>();
services.AddScoped<MyOtherConsumer>();
services.AddSingleton<ISagaRepository<MySaga>, InMemorySagaRepository<MySaga>>();

в действии configure вам необходимо зарегистрироваться потребители и саги для того, чтобы MassTransit решить их должным образом позже.

затем, в конфигурации шины, вы бы вызвать LoadFrom с поставщиком услуг:

sbc.ReceiveEndpoint(host, Configuration["QueueName"], e =>
{
    e.LoadFrom(serviceProvider);
});

по состоянию на здесь вы должны сделать это (также для того, чтобы иметь доступ к поставщику услуг), я бы предложил вам сделать это в вашем Startup ' s Configure метод. Метод может принимать любую зависимость в качестве аргумента, поэтому вы можете легко ввести поставщика услуг там:

public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider, IApplicationLifetime applicationLifetime)
{
    var bus = Bus.Factory.CreateUsingRabbitMq(sbc =>
    {
        var host = sbc.Host(new Uri("rabbitmq://localhost"), h =>
        {
            h.Username("guest");
            h.Password("guest");
        });

        sbc.ReceiveEndpoint(host, Configuration["QueueName"], e =>
        {
            e.LoadFrom(serviceProvider);
        });
    });

    // start/stop the bus with the web application
    applicationLifetime.ApplicationStarted.Register(bus.Start);
    applicationLifetime.ApplicationStopped.Register(bus.Stop);
}

один окончательный отказ от ответственности: я лично не использовал MassTransit, поэтому я действительно не знаю, имеет ли это смысл для библиотеки.