Я создал приложение .NET Core MVC и использую Dependency Injection и Repository Pattern, чтобы внедрить репозиторий в мой контроллер. Однако я получаю сообщение об ошибке:
InvalidOperationException: невозможно разрешить службу для типа «WebApplication1.Data.BloggerRepository» при попытке активировать «WebApplication1.Controllers.BlogController».
Модель (Blog.cs)
namespace WebApplication1.Models
{
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
}
}
DbContext (BloggingContext.cs)
using Microsoft.EntityFrameworkCore;
using WebApplication1.Models;
namespace WebApplication1.Data
{
public class BloggingContext : DbContext
{
public BloggingContext(DbContextOptions<BloggingContext> options)
: base(options)
{ }
public DbSet<Blog> Blogs { get; set; }
}
}
Репозиторий (IBloggerRepository.cs & BloggerRepository.cs)
using System;
using System.Collections.Generic;
using WebApplication1.Models;
namespace WebApplication1.Data
{
internal interface IBloggerRepository : IDisposable
{
IEnumerable<Blog> GetBlogs();
void InsertBlog(Blog blog);
void Save();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using WebApplication1.Models;
namespace WebApplication1.Data
{
public class BloggerRepository : IBloggerRepository
{
private readonly BloggingContext _context;
public BloggerRepository(BloggingContext context)
{
_context = context;
}
public IEnumerable<Blog> GetBlogs()
{
return _context.Blogs.ToList();
}
public void InsertBlog(Blog blog)
{
_context.Blogs.Add(blog);
}
public void Save()
{
_context.SaveChanges();
}
private bool _disposed;
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
_context.Dispose();
}
}
_disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
}
Startup.cs (соответствующий код)
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddDbContext<BloggingContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddScoped<IBloggerRepository, BloggerRepository>();
services.AddMvc();
// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();
}
Контроллер (BlogController.cs)
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using WebApplication1.Data;
using WebApplication1.Models;
namespace WebApplication1.Controllers
{
public class BlogController : Controller
{
private readonly IBloggerRepository _repository;
public BlogController(BloggerRepository repository)
{
_repository = repository;
}
public IActionResult Index()
{
return View(_repository.GetBlogs().ToList());
}
public IActionResult Create()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(Blog blog)
{
if (ModelState.IsValid)
{
_repository.InsertBlog(blog);
_repository.Save();
return RedirectToAction("Index");
}
return View(blog);
}
}
}
Я не уверен, что я делаю неправильно. Любые идеи?
Ответы:
Исключение говорит, что не может разрешить службу,
WebApplication1.Data.BloggerRepository
потому что конструктор на вашем контроллере запрашивает конкретный класс вместо интерфейса. Так что просто измени это:источник
HttpContextAccessor
класса, оказывается, что мне нужноIHttpContextAccessor
Я столкнулся с этой проблемой, потому что в настройке внедрения зависимостей мне не хватало зависимости репозитория, которая является зависимостью контроллера:
источник
В моем случае я пытался сделать внедрение зависимости для объекта, который требовал аргументов конструктора. В этом случае во время запуска я просто предоставил аргументы из файла конфигурации, например:
источник
У меня была другая проблема, и да, параметризованный конструктор для моего контроллера уже был добавлен с правильным интерфейсом. То, что я сделал, было чем-то простым. Я просто захожу в свой
startup.cs
файл, где я вижу вызов метода регистрации.В моем случае этот
Register
метод был в отдельном классеInjector
. Поэтому я должен был добавить свои недавно представленные интерфейсы.Если вы видите, параметр этой функции
this IServiceCollection
Надеюсь это поможет.
источник
Только если у кого-то такая же ситуация, как у меня, я делаю учебник EntityFramework с существующей базой данных, но когда новый контекст базы данных создается в папках моделей, нам нужно обновлять контекст при запуске, а не только в службах. AddDbContext, но AddIdentity тоже, если у вас есть аутентификация пользователей
источник
Вам нужно добавить новый сервис для
DBcontext
при запускеПо умолчанию
Добавь это
источник
Вы забыли добавить «services.AddScoped» в
ConfigureServices
методе запуска .источник
Я получил эту проблему из-за довольно глупой ошибки. Я забыл перехватить процедуру настройки службы для автоматического обнаружения контроллеров в приложении ASP.NET Core.
Добавление этого метода решило это:
источник
Мне пришлось добавить эту строку в ConfigureServices, чтобы работать.
источник
Я получал ниже исключения
Потому что я хотел зарегистрировать Factory для создания экземпляров класса DbContext Derived IBlogContextFactory и использовать метод Create для создания экземпляра экземпляра Blog Context, чтобы я мог использовать приведенный ниже шаблон вместе с инъекцией зависимостей, а также использовать mocking для модульного тестирования.
шаблон, который я хотел использовать,
Но вместо нового BloggingContext () я хочу внедрить фабрику через конструктор, как показано ниже в классе BlogController
вот мой регистрационный код сервиса
и ниже мои модели и фабричные классы
----- Исправить это в .net Core MVC проекте - я сделал ниже изменения по регистрации зависимостей
Короче говоря, разработчик ядра .net отвечает за внедрение фабричной функции, о которой в случае Unity и .Net Framework заботились.
источник
Это связано с тем, что вы не зарегистрировали компонент доступа к данным с помощью интерфейса, написанного для него. Попробуйте использовать следующим образом
источник
Если вы используете AutoFac и получаете эту ошибку, вы должны добавить оператор «As», чтобы указать сервис, который реализует конкретная реализация.
То есть. Вы должны написать:
вместо того
источник
ооо Спасибо @kimbaudi, я следовал этим правилам
https://dotnettutorials.net/lesson/generic-repository-pattern-csharp-mvc/
и получил ту же ошибку, что и ваш. Но после прочтения вашего кода я узнал, что мое решение добавляет
в метод ConfigureServices в файле StartUp.cs =))
источник
Разрешение службы выполняется еще до того, как будет достигнут код класса, поэтому нам нужно проверить наши внедрения зависимостей.
В моем случае я добавил
в StartupExtensions.cs
источник
Добавить services.AddSingleton (); в вашем методе ConfigureServices файла Startup.cs вашего проекта.
Для получения дополнительной информации, пожалуйста, посетите этот URL: https://www.youtube.com/watch?v=aMjiiWtfj2M
для всех методов (т. е. AddSingleton против AddScoped против AddTransient) Пожалуйста, посетите этот URL: https://www.youtube.com/watch?v=v6Nr7Zman_Y&list=PL6n9fhu94yhVkdrusLaQsfERmL_Jh4XmU&index=44 )
источник
У меня была та же проблема, и я обнаружил, что мой код использовал инъекцию до ее инициализации.
Я знаю, что это не имеет никакого отношения к вопросу, но, поскольку меня отправили на эту страницу, я понял, что это может быть полезно для кого-то еще.
источник
Я заменил
С участием
И это сработало для меня.
источник
Я получил эту ошибку, потому что я объявил переменную (выше метода ConfigureServices) типа, который был моим контекстом. Я имел:
Не уверен, что я думал. Я знаю, что это допустимо, если вы передаете параметр в метод Configure.
источник
Я получил ошибку: «невозможно разрешить зависимость xxxxxxxx для всех версий ядра .net». Я перепробовал все доступное в интернете и застрял на несколько дней. Единственное решение, которое я придумал, - добавить файл nuget.config в проект, а затем использовать восстановление dotnet, чтобы оно заработало.
Содержимое файла nuget.config:
источник