Невозможно разрешить службу для типа при попытке активировать
У меня есть один файл 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...