Home > front end >  Unable to resolve service for type 'BusinessServices.CustomerBusinessService' while attemp
Unable to resolve service for type 'BusinessServices.CustomerBusinessService' while attemp

Time:01-05

Issue Message: System.AggregateException: 'Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: Repository.ICustomerRepository Lifetime: Scoped ImplementationType: Repository.CustomerRepository': Unable to resolve service for type 'BusinessServices.CustomerBusinessService' while attempting to activate 'Repository.CustomerRepository'.)'


API Controller:

namespace WebAPIforAzureSQL.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    [ApiVersion("1.0")]
    [ApiVersion("2.0")]
    public class AzureController : ControllerBase
    {
        private readonly ICustomerRepository customerRepository;
        private readonly ICustomerBusinessService customerBusinessService;

        public AzureController(ICustomerRepository _customerRepository, ICustomerBusinessService _customerBusinessService)
        {
            customerRepository = _customerRepository;
            customerBusinessService = _customerBusinessService;
        }

        [MapToApiVersion("1.0")]
        [HttpGet]
        public IEnumerable<Customers> Customers()
        {
            return customerRepository.GetAllCustomers();
        }

        [MapToApiVersion("2.0")]
        [HttpGet()]
        public Customers OneCustomer([FromHeader] int customerID)
        {
            return customerRepository.GetCustomer(customerID);
        }

        [HttpGet()]
        [ApiVersion("1.0")]
        [ApiVersion("2.0")]
        public bool NewCustomer([FromHeader] Customers c) 
        {
            return customerRepository.AddCustomer(c);
        }
    }
}

Program.cs:

using Microsoft.AspNetCore.Mvc.Versioning;
using Microsoft.AspNetCore.Mvc;
using WebAPIforAzureSQL;
using Microsoft.EntityFrameworkCore;
using Repository;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Contracts;
using BusinessServices;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();

builder.Services.AddEndpointsApiExplorer();

builder.Services.AddControllers().AddXmlSerializerFormatters();

builder.Services.AddSwaggerGen();

builder.Services.ConfigureOptions<ConfigureSwaggerOptions>();

builder.Services.AddApiVersioning(opt =>
                                {
                                    opt.DefaultApiVersion = new ApiVersion(1, 0);
                                    opt.AssumeDefaultVersionWhenUnspecified = true;
                                    opt.ReportApiVersions = true;
                                    opt.ApiVersionReader = ApiVersionReader.Combine(
                                                                    new UrlSegmentApiVersionReader(),
                                                                    new HeaderApiVersionReader("api-version")
                                                                );
                                });

// Add ApiExplorer to discover versions
builder.Services.AddVersionedApiExplorer(setup =>
{
    setup.GroupNameFormat = "'v'VVV";
    setup.SubstituteApiVersionInUrl = true;
});

builder.Services.AddEndpointsApiExplorer();

builder.Services.AddDbContext<AmounDB001DbContext>(option =>
{
    option.UseSqlServer(builder.Configuration.GetConnectionString("DB001"));
});

//adding Services
builder.Services.AddScoped<ICustomerRepository, CustomerRepository>();
builder.Services.AddScoped<ICustomerBusinessService, CustomerBusinessService>();

var app = builder.Build();

var apiVersionDescriptionProvider =
    app.Services.GetRequiredService<IApiVersionDescriptionProvider>();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI(
        options =>
        {
            foreach (var description in apiVersionDescriptionProvider.ApiVersionDescriptions)
            {
                options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json",
                    description.GroupName.ToUpperInvariant());
            }
        }
    );
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();


Repository Class

namespace Repository
{
    public class CustomerRepository : ICustomerRepository
    {
        private readonly AmounDB001DbContext amounDB001DbContext;
        private readonly CustomerBusinessService customerBusinessService;
        public CustomerRepository(
            AmounDB001DbContext _amounDB001DbContext, 
            CustomerBusinessService _customerBusinessService
            )
        {
            this.amounDB001DbContext = _amounDB001DbContext;
            customerBusinessService= _customerBusinessService;
        }

        public bool AddCustomer(Customers c)
        {
            if (c != null && customerBusinessService.CheckAllFields(c))
            {
                amounDB001DbContext.Add(c);
                amounDB001DbContext.SaveChangesAsync();
                return true;
            }
            return false;
        }

        public bool RemoveCustomer(Customers c)
        {
            if (c != null && customerBusinessService.CheckAllFields(c))
            {
                amounDB001DbContext.Customers.Remove(c);
                amounDB001DbContext.SaveChanges();
                return true;
            }
            return false;
        }

        public bool UpdateCustomer(Customers c)
        {
            if (c != null && customerBusinessService.CheckAllFields(c))
            {
                amounDB001DbContext.Customers.Update(c);
                amounDB001DbContext.SaveChanges();
                return true;
            }
            return false;
        }

        public List<Customers> GetAllCustomers()
        {
            return amounDB001DbContext.Customers.ToList();
        }

        public Customers GetCustomer(int customerID)
        {
            if (customerID == 0)
            {
                return null;
            }
            return amounDB001DbContext.Customers.FirstOrDefault(c => c.CustomerID == customerID);
        }

    }
}

I'm not sure what I'm doing wrong. Any ideas?

CodePudding user response:

I think you should change the constructor of CustomerRepository, replacing the parameter type CustomerBusinessService with the interface you registered as a service ICustomerBusinessService.

public class CustomerRepository : ICustomerRepository
{
    private readonly AmounDB001DbContext amounDB001DbContext;
    private readonly ICustomerBusinessService customerBusinessService;

    public CustomerRepository(
        AmounDB001DbContext _amounDB001DbContext, 
        ICustomerBusinessService _customerBusinessService
        )
    {
        this.amounDB001DbContext = _amounDB001DbContext;
        customerBusinessService= _customerBusinessService;
    }
...
  • Related