Невозможно разрешить службу для типа при попытке активировать

У меня есть один файл Repository.cs который содержит интерфейс и его реализацию:

public interface IRepository

{
    IEnumerable<City> Cities { get; }
    void AddCity(City newCity);
}

public class MemoryRepository : IRepository
{
    private List<City> cities = new List<City> {
        new City { Name = "London", Country = "UK", Population = 8539000},
        new City { Name = "New York", Country = "USA", Population = 8406000 },
        new City { Name = "San Jose", Country = "USA", Population = 998537 },
        new City { Name = "Paris", Country = "France", Population = 2244000 }
    };

    public IEnumerable<City> Cities => cities;

    public void AddCity(City newCity)
    {
        cities.Add(newCity);
    }
}

И в HomeController я пытаюсь передать THHE Cities поглотитель к виду, как так:

public class HomeController : Controller
    {
        private IRepository repository;

        public HomeController(IRepository repo)
        {
            repository = repo;
        }

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

    }

Однако я получаю эту ошибку:

InvalidOperationException: не удается разрешить службу для типа "Cities.Models.IRepository" при попытке активировать "Cities.Controllers.HomeController".

Ответы

Ответ 1

Вам необходимо зарегистрировать IRepository в инфраструктуре Injection Dependency. Например, в ConfigureServices вы можете добавить:

services.AddScoped<IRepository, MemoryRepository>();

См. Здесь дополнительную информацию об Injection Dependency в ASP.NET Core.

AddScoped - всего лишь пример, но является одним из наиболее распространенных подходов:

Приобретенные службы жизненного цикла создаются один раз за запрос.

Ответ 2

Мы получаем эту ошибку в подходе базы данных основной структуры Entity. Я выполнил следующие шаги, и ошибка была устранена enter code here

Шаг 1. Убедитесь, что ваш конструктор класса контекста должен быть таким

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

Шаг 2. В загрузочном файле

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

Шаг 3. Строка подключения в настройках приложения

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

Шаг 4. Удалите код по умолчанию в методе OnConfiguring в классе контекста

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
}

Ответ 3

Вы должны добавить свою реализацию в раздел DI (Dependeny Injection). Для.Net Core Mvc это будет так:

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

 }

Ответ 4

Это может быть не полезно для вашего образца кода, но в моем случае такая же ошибка была результатом циклической зависимости.

Ответ 5

Подобный метод необходимо добавить в ваш 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>();

    //..
}

Услуги должны быть зарегистрированы до их использования.

ОБНОВЛЕНИЕ: Если вы не хотите использовать DI в своем приложении, просто создайте экземпляр MemoryRepository и MemoryRepository в конструкторе HomeController, например:

public class HomeController : Controller
    {
        private IRepository repository;

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

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

    }

Ответ 6

Другие ответы - ПРАВИЛЬНЫЕ, однако я раскручивал новый проект ядра 2.1.x asp.net и получил эту ошибку.

Закончилось тем, что я был опечаткой.

Так что в моем контроллере вместо правильного использования интерфейса, как это

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

Моя опечатка заставила меня использовать ApplicationRepository вместо ApplicationRepository Notice ниже, и поэтому без ОШИБКИ обнаружение пропущенного "Я" было забавным:/

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

Таким образом, контроллер не разрешал DI...