Emre Kadan
Emre Kadan

Reputation: 49

Some services are not able to be constructed IHostedService

I am trying to consume azure service bus by using .net core 6 web api. Whenever I try to run the api but It says:

System.AggregateException: 'Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: Azure.Messaging.ServiceBus.ServiceBusClient Lifetime: Singleton ImplementationType: Azure.Messaging.ServiceBus.ServiceBusClient': No constructor for type 'Azure.Messaging.ServiceBus.ServiceBusClient' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: Azure.Messaging.ServiceBus.ServiceBusProcessor Lifetime: Singleton ImplementationType: Azure.Messaging.ServiceBus.ServiceBusProcessor': A suitable constructor for type 'Azure.Messaging.ServiceBus.ServiceBusProcessor' could not be located. Ensure the type is concrete and services are registered for all parameters of a public constructor.) (Error while validating the service descriptor 'ServiceType: Microsoft.Extensions.Hosting.IHostedService Lifetime: Singleton ImplementationType: DocumentiveEmailAPI.Consumers.CompleteRegistrationConsumer': No constructor for type 'Azure.Messaging.ServiceBus.ServiceBusClient' can be instantiated using services from the service container and default values.)'

Startup.cs

builder.Services.AddSingleton<ServiceBusClient>();
builder.Services.AddSingleton<ServiceBusProcessor>();
builder.Services.AddHostedService<CompleteRegistrationConsumer>();

CompleteRegistrationConsumer.cs

public class CompleteRegistrationConsumer : IHostedService
{
    private readonly ServiceBusConfiguration _configuration;
    private readonly ServiceBusClient _client;
    private readonly ServiceBusProcessor _processor;
    private readonly IEmailService _emailService;

    public CompleteRegistrationConsumer(IOptions<ServiceBusConfiguration> configuration, ServiceBusClient client, ServiceBusProcessor processor, IEmailService emailService)
    {
        _configuration = configuration.Value;
        _client = new ServiceBusClient(_configuration.ConnectionString);
        _processor = _client.CreateProcessor("CompleteRegistrationEmailQueue", new ServiceBusProcessorOptions());
        _emailService = emailService;

    }

    private async Task Processor_ProcessMessageAsync(ProcessMessageEventArgs arg)
    {
       var messageJson = JsonConvert.DeserializeObject<CompleteRegistrationEvent>(arg.Message.Body.ToString());

        var completeRegistrationRequest = new CompleteRegistrationEvent();
        completeRegistrationRequest.EmailAddress = messageJson.EmailAddress;
        completeRegistrationRequest.VerificationCode = messageJson.VerificationCode;


        await _emailService.SendCompleteRegistrationEmail(completeRegistrationRequest);
    }

    public async Task StartAsync(CancellationToken cancellationToken)
    {
        _processor.ProcessMessageAsync += Processor_ProcessMessageAsync;
        await _processor.StartProcessingAsync();
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        _processor.DisposeAsync();
        _client.DisposeAsync();
        return Task.CompletedTask;
    }

}

It is not staring ServiceBusClient. I couldn't find any solution and article that can help me.

Upvotes: 0

Views: 764

Answers (2)

silent
silent

Reputation: 16148

Your code is redundant. You want to create Singletons and use them with DI but you are still creating new ServiceBusClient and Processor inside the constructor of CompleteRegistrationConsumer. Only do one of these. (probably only inside CompleteRegistrationConsumer).

So remove the two singleton creations and you are good to go.

Upvotes: 1

misticos
misticos

Reputation: 787

As the error states, it cannot find a proper constructor for ServiceBusClient. Therefore when adding it you need to provide a delegate constructing it, such as: Services.AddSingleton(services => new ServiceBusClient("connectionString", null)).

Upvotes: 0

Related Questions