Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Azure Queue client Dependency injection

I have an azure application developed using MVC Web API, and it uses Ninject as the dependency injection framework, here there are number of queues used to communicate with the other worker roles responsible for the background processing.

To be able to unit test I decided to wrap the QueueClient with class called QueueClientWrapper and use an interface named IQueueClientWrapper

the class and interface looks like follows,

public interface IQueueClientWrapper
{
    void Send<T>(T message);
}

public class QueueClientWrapper : IQueueClientWrapper
{
    private QueueClient _queueClient;

    public QueueClientWrapper(QueueClient queueClient)
    {
        _queueClient = queueClient;
    }

    public void Send<T>(T message)
    {
        _queueClient.Send(new BrokeredMessage(message));
    }
}

However the limitation of this approach is I need to pass the QueueClient into the constructor, which is not possible with the Ninject.

So I was thinking changing the interface like,

public interface IQueueClientWrapper
{
    void Send<T>(string connectionString,string queueName,T message);
}

so that I can use Ninject to inject the QueueClientWrapper without needing to pass constructor argument,

The issue I have now is, usually it's not recommended to create multiple queue client objects and we have to re-use same instance. So what's the best way to address this (I thought of using a static Hashtable and use to store queue name, queue client pairs, but I'm not very happy with that approach either)?

like image 204
Low Flying Pelican Avatar asked Jan 01 '26 02:01

Low Flying Pelican


1 Answers

Dealing with Dependency Injection and Azure Queue

This question is from 2014, but here is a 2022 answer

You will need these 2 official azure extensions :

  1. Azure.Storage.Queues (Contains the queue service)
  2. Microsoft.Extensions.Azure (Contains helpers for the Startup.cs)

Add this line to your Startup.cs in the Configure method :

builder.Services.AddAzureClients(builder =>
{
   builder.AddQueueServiceClient(configuration.GetValue<string>("AzureWebJobsStorage"));

});

And the constructor where you want the service :

public QueueHandlingService(QueueServiceClient queueClient)
{
  _queueClient = queueClient;
  //Or _queueClient = queueClient.GetQueueClient("myqueue-items");
}

Here are the docs for :

AddAzureClients

AddQueueServiceClient

like image 144
BorisD Avatar answered Jan 02 '26 15:01

BorisD



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!