Dazfl
Dazfl

Reputation: 775

Steeltoe Messaging with RabbitMQ - Listener and Dependency Injection issue

I'm using Steeltoe to implement Event Messaging, with RabbitMQ, between microservices, but I'm having an issue when I register my Listener service and it not recognizing other DI services.

In my Startup.cs file I have my services being registered as follows:

public void ConfigureServices(IServiceCollection servcies)
{
    ...

    // Add my custom service as a scoped service
    services.AddScoped<IMyService>(provider => new MyService());

    var rabbitSection = configuration.GetSection(RabbitOptions.PREFIX);
    services.Configure<RabbitOptions>(rabbitSection);

    services.AddRabbitServices();
    services.AddRabbitAdmin();
    services.AddRabbitTemplate();

    // Add Rabbit Listener Service
    services.AddSingleton<MyRabbitListenerService>();
    services.AddRabbitListeners<MyRabbitListenerService>();

    ...
}

... then in my MyRabbitListenerService.cs class:

public class MyRabbitListenerService
{
    private readonly IMyService _myService;

    public MyRabbitListenerService(IMyService myService)
    {
        _myService = myService;
    }

    [RabbitListener("MyQueue")]
    public async Task MessageListener(byte[] message)
    {
        // Do stuff ...
    }
}

When I run this, I'm getting an error indicating the IMyService couldn't be injected into the Listener service as it wasn't registered. I can't work out why this isn't working. Is it because I'm trying to inject a scoped service into a singleton service?

UPDATE

I did some testing and changing IMyService from a scoped service to a singleton made it work. Now I need to figure out how to get around this because in my situation it doesn't make sense to register IMyService as a singleton.

Upvotes: 0

Views: 314

Answers (1)

Hananiel
Hananiel

Reputation: 456

The reason for this error is that you cannot consume a scoped service from a singleton. Scoped has per request semantics, which for messaging doesn't make sense. Perhaps you mean AddTransient? That works. If this doesn't work for you, Can you give more detail on why MyService cannot be just transient?

Upvotes: 2

Related Questions