2017-12-18 342 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中有一个依赖注入容器,所以你应该到处使用它,而不是自己维护对象的生命周期和依赖关系。