Ich habe eine .NET Core MVC-Anwendung erstellt und mithilfe von Abhängigkeitsinjektion und Repository-Muster ein Repository in meinen Controller eingefügt. Ich erhalte jedoch eine Fehlermeldung:
InvalidOperationException: Dienst für Typ 'WebApplication1.Data.BloggerRepository' kann nicht aufgelöst werden, während versucht wird, 'WebApplication1.Controllers.BlogController' zu aktivieren.
Modell (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; }
}
}
Repository (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 (relevanter 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>();
}
Controller (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);
}
}
}
Ich bin mir nicht sicher, was ich falsch mache. Irgendwelche Ideen?
Antworten:
Die Ausnahme besagt, dass der Dienst nicht aufgelöst werden kann,
WebApplication1.Data.BloggerRepository
da der Konstruktor auf Ihrem Controller die konkrete Klasse anstelle der Schnittstelle anfordert. Also ändere das einfach:quelle
HttpContextAccessor
Unterrichts erhalten hat, stellte sich heraus, dass ich dasIHttpContextAccessor
Ich bin auf dieses Problem gestoßen, weil mir beim Setup der Abhängigkeitsinjektion eine Abhängigkeit eines Repositorys fehlte, das eine Abhängigkeit eines Controllers ist:
quelle
In meinem Fall habe ich versucht, eine Abhängigkeitsinjektion für ein Objekt durchzuführen, für das Konstruktorargumente erforderlich waren. In diesem Fall habe ich beim Start nur die Argumente aus der Konfigurationsdatei angegeben, zum Beispiel:
quelle
Ich hatte ein anderes Problem und ja, der parametrisierte Konstruktor für meinen Controller wurde bereits mit der richtigen Schnittstelle hinzugefügt. Was ich tat, war etwas Unkompliziertes. Ich gehe einfach zu meiner
startup.cs
Datei, wo ich einen Aufruf zur Registrierung der Methode sehen konnte.In meinem Fall war diese
Register
Methode in einer separaten KlasseInjector
. Also musste ich dort meine neu eingeführten Interfaces hinzufügen.Wenn Sie sehen, ist der Parameter für diese Funktion
this IServiceCollection
Hoffe das hilft.
quelle
Nur wenn jemand die gleiche Situation wie ich hat, mache ich ein Tutorial von EntityFramework mit vorhandener Datenbank, aber wenn der neue Datenbankkontext in den Modellordnern erstellt wird, müssen wir den Kontext beim Start aktualisieren, aber nicht nur in Diensten. AddDbContext, aber auch AddIdentity, wenn Sie über eine Benutzerauthentifizierung verfügen
quelle
Sie müssen
DBcontext
beim Start einen neuen Dienst hinzufügenStandard
Füge das hinzu
quelle
Sie haben vergessen, "services.AddScoped" in der Startmethode hinzuzufügen
ConfigureServices
.quelle
Ich habe dieses Problem wegen eines ziemlich dummen Fehlers bekommen. Ich hatte vergessen, meine Dienstkonfigurationsprozedur zu verknüpfen, um Controller in der ASP.NET Core-Anwendung automatisch zu erkennen.
Das Hinzufügen dieser Methode löste es:
quelle
Ich musste diese Zeile in die ConfigureServices einfügen, um arbeiten zu können.
quelle
Dieses Problem liegt daran, dass Sie die Datenzugriffskomponente nicht mit der dafür geschriebenen Schnittstelle registriert haben. Versuchen Sie es wie folgt
quelle
Wenn Sie AutoFac verwenden und diesen Fehler erhalten, sollten Sie eine "As" -Anweisung hinzufügen, um den Dienst anzugeben, den die konkrete Implementierung implementiert.
Dh. du solltest schreiben:
anstatt
quelle
Ich war unter der Ausnahme
Weil ich wollte, dass Factory registriert Instanzen der von DbContext abgeleiteten Klasse IBlogContextFactory erstellt und die Methode Create verwendet, um die Instanz von Blog Context zu instanziieren, sodass ich das folgende Muster zusammen mit der Abhängigkeitsinjektion verwenden und auch das Verspotten für Unit-Tests verwenden kann.
Das Muster, das ich verwenden wollte, ist
Anstelle von neuem BloggingContext () möchte ich die Factory über den Konstruktor wie in der folgenden BlogController-Klasse injizieren
Hier ist mein Service-Registrierungscode
und unten sind meine Modelle und Fabrikklassen
----- Um dies im .net Core MVC-Projekt zu beheben, habe ich unten Änderungen an der Abhängigkeitsregistrierung vorgenommen
Kurz gesagt, in .net ist der Kernentwickler dafür verantwortlich, die Factory-Funktion einzufügen, für die im Fall von Unity und .Net Framework gesorgt wurde.
quelle
ohh, danke @kimbaudi, ich bin diesen Tuts gefolgt
https://dotnettutorials.net/lesson/generic-repository-pattern-csharp-mvc/
und habe den gleichen Fehler wie Ihr. Aber nachdem ich Ihren Code gelesen hatte, fand ich heraus, dass meine Lösung hinzugefügt wurde
in die ConfigureServices- Methode in der Datei StartUp.cs =))
quelle
Services hinzufügen.AddSingleton (); in Ihrer ConfigureServices-Methode der Datei Startup.cs Ihres Projekts.
Weitere Informationen finden Sie unter folgender URL: https://www.youtube.com/watch?v=aMjiiWtfj2M
für alle Methoden (dh AddSingleton vs AddScoped vs AddTransient) Bitte besuchen Sie diese URL: https://www.youtube.com/watch?v=v6Nr7Zman_Y&list=PL6n9fhu94yhVkdrusLaQsfERmL_Jh4XmU&index=44 )
quelle
Ich hatte das gleiche Problem und stellte fest, dass mein Code die Injektion verwendete, bevor sie initialisiert wurde.
Ich weiß, dass es nichts mit der Frage zu tun hat, aber da ich auf diese Seite geschickt wurde, finde ich heraus, dass es für jemand anderen nützlich ist.
quelle
Das Auflösen eines Dienstes erfolgt bereits vor Erreichen des Klassencodes. Daher müssen wir unsere Abhängigkeitsinjektionen überprüfen.
In meinem Fall habe ich hinzugefügt
in StartupExtensions.cs
quelle
ich ersetzte
Mit
Und es hat bei mir funktioniert.
quelle
Ich habe diesen Fehler erhalten, weil ich eine Variable (über der ConfigureServices-Methode) vom Typ deklariert habe, die mein Kontext war. Ich hatte:
Ich bin mir nicht sicher, was ich dachte. Ich weiß, dass dies legal ist, wenn Sie einen Parameter an die Configure-Methode übergeben.
quelle
Ich habe die Fehlermeldung erhalten: "Die Abhängigkeit xxxxxxxx kann nicht für alle Versionen des .net-Kerns aufgelöst werden." Ich habe alles ausprobiert, was im Internet verfügbar ist, und war tagelang festgefahren. Die einzige Lösung, die ich gefunden habe, war das Hinzufügen der Datei nuget.config im Projekt und die anschließende Verwendung der Dotnet-Wiederherstellung.
Inhalt der Datei nuget.config:
quelle