正确过滤后请求处理

时间:2017-01-10 15:28:42

标签: c# asp.net-mvc entity-framework asp.net-web-api

我正在使用身份验证过滤器来创建实体框架dbcontext的实例,这是一种非托管资源。我将通过HttpContext.Current.Items访问它在控制器内部使用它。 (创建了一个基本控制器类,使所有控制器都可以使用此属性)。

执行控制器操作后需要处理

dbcontext。我可能用using语句包装每个动作方法调用,但它似乎是多余的。

处理完请求处理资源后,我可以使用过滤器吗?哪种过滤器适用于此目的? (问题是针对MVC和Web API)

或者你会为我正在做的事情建议一个完全不同的架构吗?

1 个答案:

答案 0 :(得分:2)

  

或者你会为我正在做的事情建议一个完全不同的架构吗?

我建议你使用依赖注入框架来处理DbContext生命周期的另一种方法。将容器中的DbContext实例配置为每个HTTP请求的实例,确保在同一HTTP请求中需要的所有位置自动注入相同的实例,并自动将其放置在最后。

大多数现代DI框架支持每个请求的实例生存期。例如,这里的an article说明了如何使用Ninject完成此操作:

kernel.Bind<EmployeeContext>().ToSelf().InRequestScope();

现在,在每个单独的动作过滤器,控制器,存储库,服务或任何依赖项中,将DbContext作为构造函数参数,将在HTTP请求的边界内注入相同的实例,这是所需的行为 - db上下文应该是尽可能缩短生命周期并确定HTTP请求的生命周期。

使用这种方法,您可以将DbContext实例的管理委派给DI框架,而不需要使用基本控制器和其他管道代码污染您的控制器。