我需要訪問我的ActionFilter
屬性中的數據庫上下文。如何在不通過構造函數傳遞上下文的情況下做到這一點?如何通過ASP.NET Core中的「using」打開數據庫連接?
簡短的問題是:如何在一行中獲取數據庫上下文,就像我們在ASP.NET Framework中做過的那樣?
我需要訪問我的ActionFilter
屬性中的數據庫上下文。如何在不通過構造函數傳遞上下文的情況下做到這一點?如何通過ASP.NET Core中的「using」打開數據庫連接?
簡短的問題是:如何在一行中獲取數據庫上下文,就像我們在ASP.NET Framework中做過的那樣?
正確的方法是使用依賴注入註冊過濾器,然後使用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中有一個依賴注入容器,所以你應該到處使用它,而不是自己維護對象的生命週期和依賴關係。
您仍然可以使用數據庫連接器,將它與連接字符串一起使用,並且您很好。 – Haytam