Ich brauche Zugriff auf meine Datenbank in einer Singleton-Klasse in meiner Startup-Klasse instanziiert. Es scheint, dass das direkte Injizieren zu einem DbContext führt, der entsorgt wird.Verwenden Sie DbContext ASP.Net Singleton Injected Klasse
bekomme ich folgende Fehlermeldung:
Cannot access a disposed object. Object name: 'MyDbContext'.
Meine Frage ist zweierlei: Warum nicht diese Arbeit und wie kann ich meine Datenbank zugreifen in einer Singleton-Klasse-Instanz?
Hier meine ConfigureServices Methode in meine Startup-Klasse ist:
public void ConfigureServices(IServiceCollection services)
{
// code removed for brevity
services.AddEntityFramework().AddSqlServer().AddDbContext<MyDbContext>(
options =>
{
var config = Configuration["Data:DefaultConnection:ConnectionString"];
options.UseSqlServer(config);
});
// code removed for brevity
services.AddSingleton<FunClass>();
}
Hier meine Controller-Klasse ist:
public class TestController : Controller
{
private FunClass _fun;
public TestController(FunClass fun)
{
_fun = fun;
}
public List<string> Index()
{
return _fun.GetUsers();
}
}
Hier ist meine FunClass:
public class FunClass
{
private MyDbContext db;
public FunClass(MyDbContext ctx) {
db = ctx;
}
public List<string> GetUsers()
{
var lst = db.Users.Select(c=>c.UserName).ToList();
return lst;
}
}
Siehe [diese Antwort] (http://stackoverflow.com/questions/36246896/structuremap-creation-as-transient-per-request-not-working/36249145#36249145). Ein Objekt kann keine Abhängigkeiten mit einer kürzeren Lebensdauer als sich selbst haben. Sie können entweder eine Factory injizieren, um Instanzen mit kürzerer Lebensdauer zu erstellen, oder eine Refactoring-Funktion ausführen, sodass der Stamm des Objektdiagramms kein Singleton ist. – NightOwl888
Ich rate Ihnen dringend davon ab, Ihren 'DbContext' als Singleton zu registrieren, es gibt viele Artikel im Internet, die Ihnen sagen, warum es eine schlechte Idee ist. Hier ist eine [Antwort] (http://stackoverflow.com/questions/10585478/one-dbcontext-per-web-request-why) vom Ersteller von [Simple Injector] (https://simpleinjector.org/index) .html) das versucht zu erklären warum. Ich würde dringend empfehlen, ein Muster wie die Muster * Repository * oder * Unit of Work * zu verwenden. – QuantumHive
@QuantumHive danke. Ich habe eine Warnung in meiner Arbeitsantwort notiert. – Tjaart