Vojislav Kovacevic
Vojislav Kovacevic

Reputation: 1525

Unable to resolve service for type while attempting to activate

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)
    {
        ...
    }
}

Upvotes: 88

Views: 341111

Answers (12)

Mahesh Tukadiya
Mahesh Tukadiya

Reputation: 1

i by mistake tried to give service class name instead of the interface.

    //HomeController.cs

public EmployeeRepository EmployeeRepository { get; }

    // i by mistake given the Employee repository class instende of the interface 
      public HomeController(EmployeeRepository employeeRepository)
      {
                EmployeeRepository = employeeRepository;
      }

    //startup.cs
    services.AddSingleton<IEmployeeRepository, EmployeeRepository>();

Upvotes: 0

Ali Al-Rasheed
Ali Al-Rasheed

Reputation: 1

public class HomeController : Controller
{
    private readonly ILogger<HomeController> logger;
    private readonly IRepository<Book> bookRepository;

    public HomeController(
               ILogger<HomeController> logger,
               IRepository<Book> bookRepository)
    {
        this.logger = logger;
        this.bookRepository = bookRepository; // Initialize context
    }
    public IActionResult Index()
    {
        var books = bookRepository.GetAll().ToList();
        return View(books);
    }
}

// in program.cs file, We need to register services

builder.Services.AddScoped<IRepository<Book>, BookRepository>();

Upvotes: 0

Tom Stickel
Tom Stickel

Reputation: 20401

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(ApplicationRepository applicationRepository)
{
    _applicationRepository = applicationRepository;
}

Thus the controller was not resolving the DI...

Upvotes: 27

deepak revidagar
deepak revidagar

Reputation: 11

There is one more possibility that, You might have sent wrong variable in the place while writing this HTTPPOST last part code

mine is

var categoryMap = _mapper.Map(categoryCreate);

        if(!_categoryRepository.CreateCategory(categoryMap))
        {
            ModelState.AddModelError("", "Something went wrong while saving");
            return StatusCode(500, ModelState);
        }
        return Ok("Successfully created");

in the if condition I passed the category as parameter instead of categoryMap

so please cross check

Upvotes: 0

MarwanAbu
MarwanAbu

Reputation: 179

For me I am using visual studio 2022 and .NET 6

the solution was add the following line in the Program.cs file :

builder.Services.AddSingleton<IHISInterface<UserDetails>, UserDetailsRepository>();

Upvotes: 1

karunakar bhogyari
karunakar bhogyari

Reputation: 679

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)
{
}

Upvotes: 19

Timur
Timur

Reputation: 1343

In my case, I was trying to access context through constructor. like here;

 private readonly Context _context;

 public ImageController(Context context)
 {
    _context = context;
 }

But When I tried to access the context just by creating an instance of class, it worked like here;

 Context c = new Context();

Upvotes: 0

Kirk Larkin
Kirk Larkin

Reputation: 93063

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.

Upvotes: 141

Mohammad Darweesh
Mohammad Darweesh

Reputation: 19

you have to register your repository like this

services.AddSingleton<IRepository, MemoryRepository>();

Upvotes: 1

gneric
gneric

Reputation: 3685

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

Upvotes: 2

Afshar
Afshar

Reputation: 11483

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);
        }

    }

Upvotes: 5

Ekrem
Ekrem

Reputation: 21

You have to add your implementation to DI (Dependeny Injection) section. For .Net Core Mvc, it would be like this:

 public void ConfigureServices(IServiceCollection services)
 {
   services.AddDbContext<ApplicationDbContext>(options =>
    options.UseInMemoryDatabase()
   );
   services.AddScoped<IRepository, MemoRepostory>();

 }

Upvotes: 2

Related Questions