2017-12-18 341 views
1

我需要訪問我的ActionFilter屬性中的數據庫上下文。如何在不通過構造函數傳遞上下文的情況下做到這一點?如何通過ASP.NET Core中的「using」打開數據庫連接?

簡短的問題是:如何在一行中獲取數據庫上下文,就像我們在ASP.NET Framework中做過的那樣?

+0

您仍然可以使用數據庫連接器,將它與連接字符串一起使用,並且您很好。 – Haytam

回答

5

正確的方法是使用依賴注入註冊過濾器,然後使用ServiceFilterAttribute將過濾器放入管道中。這樣,你的過濾器類型將使用依賴注入來解析,所以你可以正確地注入數據​​庫上下文並像通常那樣使用它。

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) 
    { } 
} 

Startup.ConfigureServices註冊類型:

services.AddTransient<MyActionFilter>(); 

然後使用ServiceFilterAttribute來激活它。無論是作爲一個控制器上的屬性或一個動作:

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

或全局寄存器它像經由MvcOptions任何其他過濾器:

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

然後,MyActionFilter將在所有需要的每個請求被解析過濾器,數據庫上下文將從依賴注入容器注入適當的生命週期。

通常不推薦實例化數據庫上下文(在單元測試之外)。你在ASP.NET Core中有一個依賴注入容器,所以你應該到處使用它,而不是自己維護對象的生命週期和依賴關係。