Дополнительно
Ошибка впрыска Core Dependency ASP.NET: невозможно разрешить обслуживание для типа при попытке активации
Я создал приложение .NET Core MVC и использую шаблон впрыска и репозитория зависимостей для вливания репозитория в мой контроллер. Однако я получаю ошибку :
& gt; 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);
}
}
}
Я не уверен, что я делаю неправильно. Любые идеи?
146
16
Исключение говорит, что оно не может разрешить услугу для
WebApplication1.Data.BloggerRepository
, потому что конструктор на вашем контроллере запрашивает конкретный класс вместо интерфейса. Так что просто измените это :Я столкнулся с этой проблемой, потому что в настройке инъекции зависимостей мне не хватало зависимости хранилища, которая является зависимостью контроллера :
В моем случае я пытался сделать инъекцию зависимости для объекта, который требовал аргументов конструктора. В этом случае во время запуска я просто предоставил аргументы из файла конфигурации, например:
Только если у кого-то такая же ситуация, как у меня, Я делаю учебник EntityFramework с существующей базой данных, но когда новый контекст базы данных создается в папках моделей, нам нужно обновить контекст в стартапе, но не только в сервисах. AddDbContext, но и AddIdentity, если у вас есть аутентификация пользователей
У меня была другая проблема, и да, параметризованный конструктор для моего контроллера уже был добавлен с правильным интерфейсом. То, что я сделал, было чем-то простым. Я просто перехожу к своему файлу startup.cs, где я могу увидеть метод вызова для регистрации.
В моем случае этот метод «Регистрация» был в отдельном классе «Инктор». Поэтому я должен был добавить свои недавно представленные интерфейсы там.
Если вы видите, параметром этой функции является
this IServiceCollection
Надеюсь, это поможет.
Вам необходимо добавить новый сервис для
DBcontext
при запускеПо умолчанию
Добавьте это
Я должен был добавить эту строку в ConfigureServices, чтобы работать.
Я получил эту проблему из-за довольно глупой ошибки. Я забыл подключить процедуру настройки службы, чтобы автоматически обнаруживать контроллеры в приложении ASP.NET Core.
Добавление этого метода решило это:
ооо, спасибо @kimbaudi, я следовал за этим
https://dotnettutorials.net/lesson/generic-repository-pattern-csharp-mvc/
и получил ту же ошибку, что и ваш. Но после прочтения вашего кода я узнал, что мое решение добавляет
& Gt; services.AddScoped (IGenericRepository & lt; Todo & gt;, GenericRepository & lt; Todo & gt;) ;
в ConfigureServices метод в файле StartUp.cs =))
Вы забыли добавить «services.AddScoped» в стартап-метод «Configureservices».
Эта проблема заключается в том, что вы не зарегистрировали компонент доступа к данным с интерфейсом, написанным для него. Попробуйте использовать следующим образом
Если вы используете AutoFac и получаете эту ошибку, вам следует добавить оператор «As», чтобы указать услугу, которую реализует конкретная реализация.
Т.е. ты должен написать:
вместо
Я становился ниже исключения
Потому что я хотел, чтобы register Factory создавал экземпляры класса DbContext Derived IBlogContextFactory и использовал метод создания экземпляра для создания экземпляра контекста блога, чтобы я мог использовать шаблон ниже вместе с зависимостью Injection, а также использовать насмешки для модульного тестирования.
шаблон, который я хотел использовать
Но вместо нового BloggingContext () я хочу вводить фабрику через конструктор, как в ниже классе BlogController
вот мой регистрационный код сервиса
и ниже мои модели и заводские классы
----- Чтобы исправить это в проекте .net Core MVC - я сделал ниже изменения в регистрации зависимостей
Короче говоря, основной разработчик .net отвечает за ввод заводских функций, о которых в случае Unity и .Net Framework позаботились.
Я заменил
services.Add (новый ServiceDescriptor (typeof (IMyLogger), typeof (MyLogger))
Сservices.AddTransient & lt; IMyLogger, MyLogger & gt; ()
И это сработало для меня.
Я получил эту ошибку, потому что я объявил переменную (выше метода ConfigureServices) типа, который был моим контекстом. Я имел:
Не уверен, о чем я думал. Я знаю, что это законно, если вы передаете параметр методу Configure.
Я получил ошибку: «невозможно разрешить зависимость xxxxxxxx для всех версий ядра .net». Я перепробовал все, что есть в Интернете, и застрял на несколько дней. Единственное решение, которое я придумал, - это добавление файла nuget.config в проект, а затем использование восстановления dotnet, чтобы заставить его работать.
Содержимое файла nuget.config: