2017-12-18 5 views
1

Ich brauche Zugriff auf den Datenbankkontext innerhalb meines ActionFilter Attributs. Wie kann ich das tun, ohne den Kontext durch den Konstruktor zu übergeben?Wie öffne ich eine Datenbankverbindung durch "Verwendung" in ASP.NET Core?

Die kurze Frage ist: Wie erhalten Sie den Datenbankkontext in einer Zeile wie zuvor im ASP.NET Framework?

+0

Sie können den DB Connector weiterhin verwenden, ihn mit der Verbindungszeichenfolge in einer Anwendung installieren, und Sie können loslegen. – Haytam

Antwort

5

Der richtige Weg wäre, Ihren Filter mit Abhängigkeitsinjektion zu registrieren und dann den ServiceFilterAttribute zu verwenden, um Ihren Filter in die Pipeline zu platzieren. Auf diese Weise wird Ihr Filtertyp mithilfe der Abhängigkeitsinjektion aufgelöst, sodass Sie Ihren Datenbankkontext einfach einfügen und wie gewohnt verwenden können.

public class MyActionFilter : IActionFilter 
{ 
    private readonly MyDbContext _dbContext; 

    public MyActionFilter(MyDbContext dbContext) 
    { 
     _dbContext = dbContext; 
    } 

    public void OnActionExecuted(ActionExecutedContext context) 
    { 
     // use _dbContext here 
    } 

    public void OnActionExecuting(ActionExecutingContext context) 
    { } 
} 

die Art in Startup.ConfigureServices registrieren:

services.AddTransient<MyActionFilter>(); 

Und dann die ServiceFilterAttribute es zu aktivieren verwenden. Entweder als ein Attribut auf einem Controller oder einer Aktion:

[ServiceFilter(typeof(MyActionFilter))] 
public class MyController : Controller 
{ 
    // … 
} 

oder registrieren sie global wie jeder andere Filter über die MvcOptions:

services.AddMvc(options => { 
    options.Filters.Add(new ServiceFilterAttribute(typeof(MyActionFilter))); 
}); 

Dann wird die MyActionFilter auf jede Anforderung gelöst werden, dass die erfordert Filter, und der Datenbankkontext wird mit der richtigen Lebensdauer aus dem Abhängigkeitsinjektionscontainer injiziert.

Die Instanziierung des Datenbankkontexts selbst (außerhalb von Komponententests) wird im Allgemeinen nicht empfohlen. Sie haben einen Dependency-Injektionscontainer in ASP.NET Core. Sie sollten ihn also überall verwenden, anstatt die Lebensdauer und Abhängigkeiten von Objekten selbst zu verwalten.