Creé una aplicación .NET Core MVC y uso la inyección de dependencia y el patrón de repositorio para inyectar un repositorio en mi controlador. Sin embargo, recibo un error:
InvalidOperationException: no se puede resolver el servicio para el tipo 'WebApplication1.Data.BloggerRepository' al intentar activar 'WebApplication1.Controllers.BlogController'.
Modelo (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; }
}
}
Repositorio (IBloggerRepository.cs y 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 (código relevante)
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>();
}
Controlador (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);
}
}
}
No estoy seguro de lo que estoy haciendo mal. ¿Algunas ideas?
Respuestas:
La excepción dice que no puede resolver el servicio
WebApplication1.Data.BloggerRepository
porque el constructor en su controlador está pidiendo la clase concreta en lugar de la interfaz. Así que solo cambia eso:fuente
HttpContextAccessor
clase, resultó que necesitaba elIHttpContextAccessor
Me encontré con este problema porque en la configuración de inyección de dependencia me faltaba una dependencia de un repositorio que es una dependencia de un controlador:
fuente
En mi caso, estaba tratando de hacer una inyección de dependencia para un objeto que requería argumentos de constructor. En este caso, durante el inicio, solo proporcioné los argumentos del archivo de configuración, por ejemplo:
fuente
Estaba teniendo un problema diferente, y sí, el constructor parametrizado para mi controlador ya estaba agregado con la interfaz correcta. Lo que hice fue algo sencillo. Solo voy a mi
startup.cs
archivo, donde pude ver una llamada para registrar el método.En mi caso, este
Register
método estaba en una clase separadaInjector
. Así que tuve que agregar mis interfaces recién introducidas allí.Si ve, el parámetro para esta función es
this IServiceCollection
Espero que esto ayude.
fuente
Solo si alguien tiene la misma situación que yo, estoy haciendo un tutorial de EntityFramework con la base de datos existente, pero cuando se crea el nuevo contexto de la base de datos en las carpetas de los modelos, necesitamos actualizar el contexto en el inicio, pero no solo en los servicios. AddDbContext pero AddIdentity también si tiene autenticación de usuarios
fuente
Necesita agregar un nuevo servicio para
DBcontext
en el inicioDefecto
Agrega esto
fuente
Olvidó agregar "services.AddScoped" en el
ConfigureServices
método de inicio .fuente
Tengo este problema debido a un error bastante tonto. Había olvidado conectar mi procedimiento de configuración de servicio para descubrir controladores automáticamente en la aplicación ASP.NET Core.
Agregar este método lo resolvió:
fuente
Tuve que agregar esta línea en ConfigureServices para poder trabajar.
fuente
Me estaba poniendo por debajo de la excepción
Porque quería registrar Factory para crear instancias de la clase DbContext Derived IBlogContextFactory y usar el método Create para crear instancias de Blog Context para que pueda usar el siguiente patrón junto con la Inyección de dependencia y también puedo usar burlas para pruebas unitarias.
el patrón que quería usar es
Pero en lugar de nuevo BloggingContext () quiero inyectar fábrica a través del constructor como en la siguiente clase BlogController
aquí está mi código de registro de servicio
y abajo están mis modelos y clases de fábrica
----- Para arreglar esto en el proyecto .net Core MVC - Hice los siguientes cambios en el registro de dependencia
En resumen, en .net core developer es responsable de inyectar la función de fábrica, que en el caso de Unity y .Net Framework se encargaron.
fuente
Este problema se debe a que no registró el componente de acceso a datos con la interfaz escrita para él. Intenta usar lo siguiente
fuente
Si está utilizando AutoFac y obtiene este error, debe agregar una instrucción "As" para especificar el servicio que implementa la implementación concreta.
Es decir. Deberías escribir:
en vez de
fuente
ohh, gracias @kimbaudi, seguí estos tuts
https://dotnettutorials.net/lesson/generic-repository-pattern-csharp-mvc/
y obtuve el mismo error que tu. Pero después de leer su código descubrí que mi solución estaba agregando
en el método ConfigureServices en el archivo StartUp.cs =))
fuente
La resolución de un servicio se realiza incluso antes de alcanzar el código de clase, por lo que debemos verificar nuestras inyecciones de dependencia.
En mi caso agregué
en StartupExtensions.cs
fuente
Agregar servicios. AgregarSingleton (); en su método ConfigureServices del archivo Startup.cs de su proyecto.
Para obtener más detalles, visite esta URL: https://www.youtube.com/watch?v=aMjiiWtfj2M
Para todos los métodos (es decir, AddSingleton vs AddScoped vs AddTransient) Visite esta URL: https://www.youtube.com/watch?v=v6Nr7Zman_Y&list=PL6n9fhu94yhVkdrusLaQsfERmL_Jh4XmU&index=44 )
fuente
Tuve el mismo problema y descubrí que mi código estaba usando la inyección antes de que se inicializara.
Sé que no tiene nada que ver con la pregunta, pero como me enviaron a esta página, creo que puede ser útil para otra persona.
fuente
Reemplacé
Con
Y funcionó para mí.
fuente
Recibí este error porque declaró una variable (por encima del método ConfigureServices) de tipo que era mi contexto. Yo tenía:
No estoy seguro de lo que estaba pensando. Sé que es legal hacer esto si pasas un parámetro al método Configure.
fuente
Recibí el error: "no se puede resolver la dependencia xxxxxxxx para todas las versiones de .net core". Probé todo lo que estaba disponible en Internet y estuve atrapado durante días. La única solución que se me ocurrió fue agregar el archivo nuget.config en el proyecto y luego usar dotnet restore para que funcione.
Contenido del archivo nuget.config:
fuente