ASP.NET de Base de l'Injection de Dépendances d'erreur: Impossible de résoudre de service pour le type, tout en tentant d'activer
J'ai créé un .NET Core, MVC de l'application et de l'utilisation de l'Injection de Dépendances et d'un Modèle de Référentiel pour injecter un référentiel de mon contrôleur. Cependant, j'obtiens une erreur:
InvalidOperationException: Impossible de résoudre un service de type " WebApplication1.Les données.BloggerRepository' tout en tentant d'activer " WebApplication1.Les contrôleurs.BlogController'.
Modèle (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; }
}
}
Référentiel (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);
}
}
}
De démarrage.cs (code)
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>();
}
Contrôleur (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);
}
}
}
Je ne suis pas sûr de ce que je fais mal. Des idées?
- Je sais que c'est une vieille question, mais... Vous ne devriez pas jeter la db contexte à l'intérieur d'un service. La db contexte est automatiquement éliminés par le champ d'application de résolution. Si vous disposer à l'intérieur d'un service, il peut être éliminé lors de l'appel d'un prochain service au sein de la même demande/domaine d'application.
- Assurez-vous que le service(manque de classe) est ajouté à l'aide de services.AddTransient<YourClassOrInterface>();
Vous devez vous connecter pour publier un commentaire.
L'exception, dit-il, ne peut pas résoudre le service pour
WebApplication1.Data.BloggerRepository
car le constructeur de votre contrôleur est demandé pour la classe de béton au lieu de l'interface. Donc il suffit de changer que:Dans mon cas, j'ai essayé de faire de l'injection de dépendances pour un objet qui a exigé des arguments du constructeur. Dans ce cas, au Démarrage j'ai juste fourni les arguments à partir du fichier de configuration, par exemple:
Que si quelqu'un a le même genre de situation, moi, je suis en train de faire un tutoriel de EntityFramework avec la base de données existante, mais quand le nouveau contexte de base de données est créée sur les modèles de dossiers, nous avons besoin de mettre à jour le contexte du démarrage, mais pas seulement dans les services.AddDbContext mais AddIdentity trop si vous avez des utilisateurs de l'authentification
Je suis tombé sur cette question, car dans l'injection de dépendances de l'installation j'ai été absent une dépendance d'un référentiel qui est une dépendance d'un contrôleur:
J'ai eu un autre problème, et oui le constructeur paramétré pour mon controlleror a déjà été ajouté à l'interface correcte. Ce que j'ai fait quelque chose de simple. Je viens de passer mon
startup.cs
fichier, où j'ai pu voir un appel à la méthode register.Dans mon cas, ce
Register
méthode a été dans une catégorie distincteInjector
. J'ai donc dû ajouter mes nouvellement introduit Interfaces là.Si vous le voyez, le paramètre de cette fonction est
this IServiceCollection
Espère que cette aide.
J'ai eu ce problème à cause de plutôt stupide erreur. J'avais oublié d'accrocher mes service de la procédure de configuration de découvrir les contrôleurs automatiquement dans le ASP.NET application de Base.
L'ajout de cette méthode résolu:
J'ai dû ajouter cette ligne dans le ConfigureServices pour travailler.
Vous avez besoin pour ajouter un nouveau service pour
DBcontext
dans le démarragePar défaut
Ajouter cette
Vous êtes oubliez pas d'ajouter Addscope sur le démarrage
Configureservices
méthode.Si vous utilisez AutoFac et obtenez cette erreur, vous devez ajouter un "Comme" déclaration de spécifier le service de la mise en œuvre concrète des outils.
Ie. vous devriez écrire:
au lieu de
ohh, Merci @kimbaudi, j'ai suivi ce tuts
https://dotnettutorials.net/lesson/generic-repository-pattern-csharp-mvc/
et a obtenu la même erreur que votre. Mais après avoir lu votre code, j'ai trouvé ma solution était d'ajouter
en ConfigureServices méthode de Démarrage.cs fichier =))
J'étais ci-dessous exception
Parce que je voulais enregistrer Usine à créer des instances de DbContext classe Dérivée IBlogContextFactory et l'utilisation de méthode de création d'instancier exemple de Blog de Contexte, de sorte que je peux utiliser en dessous de la répétition avec l'Injection de dépendance et peut également utiliser les moqueries pour les tests unitaires.
le modèle que je voulais utiliser est
Mais au Lieu de nouvelles BloggingContext() je veux Injecter de l'usine par le constructeur comme ci-dessous BlogController classe
voici mon code d'enregistrement
et ci-dessous sont mes modèles et les classes usine
----- Pour Résoudre ce problème dans .net de Base projet MVC-je l'ai fait ci-dessous les changements sur la dépendance de l'enregistrement
En bref dans .net core développeur est responsable pour injecter de l'usine de la fonction, qui dans le cas de l'Unité et de la .Net Framework a été pris en charge.
J'ai remplacé
services.Add(new ServiceDescriptor(typeof(IMyLogger), typeof(MyLogger)))
Avec
services.AddTransient<IMyLogger, MyLogger>()
Et il a travaillé pour moi.
Cette question c'est parce que vous n'avez pas enregistré le composant d'accès aux données avec l'interface écrite pour elle. Essayez d'utiliser comme suit
J'ai eu cette erreur parce que j'ai déclaré une variable (au-dessus de la ConfigureServices méthode) de type qui a été mon contexte. J'ai eu:
Pas sûr de ce que je pensais. Je sais qu'il est légal de le faire si votre passage en paramètre à la méthode Configure ().