Constructor is Ambiguous error .NET Core Web API

0

I'm new to Web API. In my .NET Core 3.1 web api I have defined 3 constructors beleiving overloading.

[Route("api/[controller]")]
[ApiController]
public class KipController : ControllerBase
{
    private readonly IConfiguration _configuration;
    private readonly IMapper _mapper;
    private readonly dbLNePMODev1Context _context;
    public KipController(IConfiguration configuration)
    {
        _configuration = configuration;
    }
    public KipController(IMapper mapper)
    {
        _mapper = mapper;
    }

    public KipController(dbLNePMODev1Context context)
    {
        _context = context;
    }
    ......

But when executing the application it says the following error

System.AggregateException HResult=0x80131500 Message=Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: epmoAPI.Models.dbLNePMODev1Context Lifetime: Scoped ImplementationType: epmoAPI.Models.dbLNePMODev1Context': Unable to activate type 'epmoAPI.Models.dbLNePMODev1Context'. The following constructors are ambiguous: Void .ctor(Microsoft.EntityFrameworkCore.DbContextOptions) Void .ctor(Microsoft.EntityFrameworkCore.DbContextOptions1[epmoAPI.Models.dbLNePMODev1Context])) Source=Microsoft.Extensions.DependencyInjection StackTrace: at Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(IEnumerable1 serviceDescriptors, ServiceProviderOptions options) at Microsoft.Extensions.DependencyInjection.ServiceCollectionContainerBuilderExtensions.BuildServiceProvider(IServiceCollection services, ServiceProviderOptions options) at Microsoft.Extensions.DependencyInjection.DefaultServiceProviderFactory.CreateServiceProvider(IServiceCollection containerBuilder) at Microsoft.Extensions.Hosting.Internal.ServiceFactoryAdapter`1.CreateServiceProvider(Object containerBuilder) at Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider() at Microsoft.Extensions.Hosting.HostBuilder.Build() at epmoAPI.Program.Main(String[] args) in C:\Projects\Enterprise PMO\ePMOHub\epmoAPI\Program.cs:line 16

This exception was originally thrown at this call stack: [External Code]

Inner Exception 1: InvalidOperationException: Error while validating the service descriptor 'ServiceType: epmoAPI.Models.dbLNePMODev1Context Lifetime: Scoped ImplementationType: epmoAPI.Models.dbLNePMODev1Context': Unable to activate type 'epmoAPI.Models.dbLNePMODev1Context'. The following constructors are ambiguous: Void .ctor(Microsoft.EntityFrameworkCore.DbContextOptions) Void .ctor(Microsoft.EntityFrameworkCore.DbContextOptions`1[epmoAPI.Models.dbLNePMODev1Context])

Inner Exception 2: InvalidOperationException: Unable to activate type 'epmoAPI.Models.dbLNePMODev1Context'. The following constructors are ambiguous: Void .ctor(Microsoft.EntityFrameworkCore.DbContextOptions) Void .ctor(Microsoft.EntityFrameworkCore.DbContextOptions`1[epmoAPI.Models.dbLNePMODev1Context])

Please help me. I am not getting an idea whats wrong in my code

asp.net-core
asp.net-web-api
asp.net-core-webapi

2 Answers

1

Your IConfiguration (and probably IMapper) use dependency injection, while dbLNePMODev1Context does not. That's why ASP.NET Core can't instantiate it.

A cleaner solution:

public KipController(IConfiguration configuration = null, IMapper mapper = null, dbLNePMODev1Context context = null)
{
    _configuration = configuration;
    _mapper = mapper;
    _context = context;
}
answered on Stack Overflow May 7, 2020 by Sergey Kovalev
0

If your dbLNePMODev1Context class inherits from DbContext (If your project uses EntityFrameworkCore) then you can register dbLNePMODev1Context as a DBContext in ConfigureServices method. You can add DbContextOptionsBuilder to indicate type of DB, Connection String and other details.

public void ConfigureServices(IServiceCollection services)
{
...
services.AddDbContext<dbLNePMODev1Context>();
...
}

If your dbLNePMODev1Context class does not use EntityFramework then you can just register it as a service .Please decide on Scoped,Transient or Singleton. Reference

public void ConfigureServices(IServiceCollection services)
{
...
services.AddSingleton(new dbLNePMODev1Context());
...
}

It would give a better idea if you share your ConfigureServices method from Startup.cs class.

answered on Stack Overflow May 7, 2020 by HelpMeSo

User contributions licensed under CC BY-SA 3.0