【问题标题】:Right Filter For After Request Processing请求处理后的右过滤器
【发布时间】:2017-01-10 15:28:41
【问题描述】:
我正在使用身份验证过滤器来创建实体框架dbcontext 的实例,这是一个非托管资源。我将通过HttpContext.Current.Items 访问它来在控制器内部使用它。 (创建了一个基本控制器类以使该属性可用于所有控制器)。
dbcontext需要在控制器动作执行后进行处理。我可能会用 using 语句包装每个操作方法调用,但这似乎是多余的。
我可以在处理请求后使用过滤器来释放资源吗?哪种过滤器适合此目的? (问题是针对 MVC 和 Web API)
或者你会建议我正在做的完全不同的架构吗?
【问题讨论】:
标签:
c#
asp.net-mvc
entity-framework
asp.net-web-api
【解决方案1】:
或者你会建议我正在做的完全不同的架构吗?
我建议您使用依赖注入框架来处理 DbContext 生命周期的不同方法。将容器中的 DbContext 实例配置为每个 HTTP 请求的实例,以确保同一实例将自动注入到同一 HTTP 请求中需要的所有位置,并在结束时自动释放。
大多数现代 DI 框架都支持每个请求的实例生命周期。例如,这里的 an article 说明了如何使用 Ninject 完成此操作:
kernel.Bind<EmployeeContext>().ToSelf().InRequestScope();
现在,在每个单独的操作过滤器、控制器、存储库、服务或您喜欢的任何依赖项中,都将 DbContext 作为构造函数参数,相同的实例将被注入到 HTTP 请求的边界内,这是所需的行为 - 数据库上下文应该是尽可能短的生命周期,并限制在 HTTP 请求的生命周期内。
使用这种方法,您将 DbContext 实例的管理委托给您的 DI 框架,并且不需要使用基本控制器和其他管道代码污染您的控制器。