Unable to resolve service for type while attempting to activate

151,799

Solution 1

For the Dependency Injection framework to resolve IRepository, it must first be registered with the container. For example, in ConfigureServices, add the following:

services.AddScoped<IRepository, MemoryRepository>();

For .NET 6+, which uses the new hosting model by default, add the following in Program.cs instead:

builder.Services.AddScoped<IRepository, MemoryRepository>();

AddScoped is just one example of a service lifetime:

For web applications, a scoped lifetime indicates that services are created once per client request (connection).

See the docs for more information on Dependency Injection in ASP.NET Core.

Solution 2

We are getting this error in Entity frame work core database first approach. I followed below steps and error got resolved

Step 1: Check Your context class constructor should be like this

public partial class ZPHSContext : DbContext
{
    public ZPHSContext(DbContextOptions<ZPHSContext> dbContextOptions)
        : base(dbContextOptions)
    {
    }
}
    

Step 2: In Startup file

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddDbContext<ZPHSContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("BloggingDatabase")));
}
    

Step 3: Connection string in appsettings

"ConnectionStrings": {
    "BloggingDatabase": "Server=****;Database=ZPHSS;Trusted_Connection=True;"
}

Step 4: Remove default code in OnConfiguring method in context class

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
}

Solution 3

Other answers are CORRECT, however I was spinning up a new asp.net core 2.1.x project and got this error.

Ended up being a typo by ME.

So in my Controller instead of Correctly using the Interface like this

public HomeController(IApplicationRepository applicationRepository)
{
    _applicationRepository = applicationRepository;
}

My typo had me using ApplicationRepository instead of its interface IApplicationRepository Notice below, and so with NO ERRORS spotting the missing "I" was fun :/

public HomeController(IApplicationRepository applicationRepository)
{
    _applicationRepository = applicationRepository;
}

Thus the controller was not resolving the DI...

Solution 4

A method like this needs to be added to your Startup:

    // This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    //...

    // Add application services.
    services.AddTransient<IRepository, MemoryRepository>();

    //..
}

Services should be registered before used.

UPDATE: If you do not want to use DI on your application, just create and instance of MemoryRepository on the constructor of HomeController, like this:

public class HomeController : Controller
    {
        private IRepository repository;

        public HomeController()
        {
            repository = new MemoryRepository();
        }

        public IActionResult Index()
        {
            return View(repository.Cities);
        }

    }

Solution 5

This may not be helpful for your code sample but in my case the same error was a result of a circular dependency.

Share:
151,799
Vojislav Kovacevic
Author by

Vojislav Kovacevic

Updated on July 09, 2022

Comments

  • Vojislav Kovacevic
    Vojislav Kovacevic almost 2 years

    In my ASP.NET Core application, I get the following error:

    InvalidOperationException: Unable to resolve service for type 'Cities.Models.IRepository' while attempting to activate 'Cities.Controllers.HomeController'.

    I the HomeController I am trying to pass the Cities getter to the view like so:

    public class HomeController : Controller
    {
        private readonly IRepository repository;
    
        public HomeController(IRepository repo) => repository = repo;
    
        public IActionResult Index() => View(repository.Cities);
    }
    

    I have one file Repository.cs that contains an interface and its implementation like so:

    public interface IRepository
    {
        IEnumerable<City> Cities { get; }
        void AddCity(City newCity);
    }
    
    public class MemoryRepository : IRepository
    {
        private readonly List<City> cities = new List<City>();
    
        public IEnumerable<City> Cities => cities;
    
        public void AddCity(City newCity) => cities.Add(newCity);
    }
    

    My Startup class contains the default-generated code from the template. I have made any changes:

    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
    
        public IConfiguration Configuration { get; }
    
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();
        }
    
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            ...
        }
    }
    
  • Vojislav Kovacevic
    Vojislav Kovacevic over 6 years
    How could my existing code be modified to work without using DI?
  • sezmeralda
    sezmeralda over 2 years
    I ... I can't believe this was my problem. Exactly my problem. So much pain... Thank you!
  • Merna Mustafa
    Merna Mustafa over 2 years
    No Way! this was my problem too!
  • qqtf
    qqtf almost 2 years
    using a singleton, I don't think that is a default solution, AddScoped makes more sense