Wir haben einen ähnlichen Fall wie Sie. Was wir getan haben, ist zu verwenden, um die implementationfactory Überlastung des IServiceCollection in den ConfigureServices Methode der Startup Klasse, etwa so:
//First register a custom made db context provider
services.AddTransient<ApplicationDbContextFactory>();
//Then use implementation factory to get the one you need
services.AddTransient(provider => provider.GetService<ApplicationDbContextFactory>().CreateApplicationDbContext());
Es ist sehr schwierig für mich, gerade jetzt zu implementieren CreateApplicationDbContext für Sie, weil es völlig davon abhängt, was Sie genau wollen. Aber sobald man diesen Teil herausgefunden haben, wie Sie es genau tun wollen, die Grundlagen der Methode sollte wie diese ohnehin aussehen:
public ApplicationDbContext CreateApplicationDbContext(){
//TODO Something clever to create correct ApplicationDbContext with ConnectionString you need.
}
Sobald dies durchgeführt wird Sie die richtige ApplicationDbContext in Ihrem Controller wie Sie injizieren hat im Konstruktor:
public MyController(ApplicationDbContext dbContext)
{
_dbContext = dbContext;
}
oder eine Aktion Methode in der Steuerung:
public IActionResult([FromServices] ApplicationDbContext dbContext){
}
auch immer Sie die Details implementieren, ist der Trick, dass die implementatio n factory erstellt Ihren ApplicationDbContext jedes Mal, wenn Sie ihn injizieren.
Sagen Sie mir, wenn Sie weitere Hilfe bei der Implementierung dieser Lösung benötigen.
Update # 1 Yuriy N. fragte, was ist der Unterschied zwischen AddTransient und AddDbContext, die eine berechtigte Frage ist ... Und es ist nicht. Lassen Sie mich erklären.
Dies ist nicht relevant für die ursprüngliche Frage.
ABER ... Nachdem das gesagt wurde, kann die Implementierung Ihrer eigenen "Implementierungsfabrik" (was das Wichtigste ist, was ich über meine Antwort notieren muss) in diesem Fall mit Entitätsframework etwas komplizierter sein als das, was wir brauchten.
Bei solchen Fragen können wir uns heute glücklicherweise den Sourcecode in GitHub ansehen, also habe ich nachgeschaut was AddDbContext genau macht. Und nun ... Das ist nicht wirklich schwierig. Diese 'add' (und 'use') Extension-Methoden sind nichts anderes als Convenience-Methoden, denken Sie daran. Also müssen Sie alle Dienste, die AddDbContext tut, plus die Optionen hinzufügen. Vielleicht können Sie sogar die AddDbContext-Erweiterungsmethode wiederverwenden, fügen Sie einfach Ihre eigene Überladung mit einer Implementierungsfactory hinzu.
Also, um auf Ihre Frage zurückzukommen. AddDbContext macht einige EF-spezifische Sachen. Wie Sie sehen können, werden sie Ihnen ermöglichen, eine Lebenszeit in einer späteren Version zu verbringen (transient, Singleton). AddTransient ist Asp.Net Core, mit dem Sie jeden Service hinzufügen können, den Sie brauchen. Und Sie brauchen eine Implementierungsfabrik.
Ist das klarer?
dauerhaft oder vorübergehend für die Dauer der Anforderung? – Tseng
@Tseng vorübergehend, während der Lebensdauer des Controllers. –