每个 HTTP 请求的 DbContext,但避免依赖数据层中的 HttpContext



我一直在考虑如何在分层应用程序中使用每个HttpRequest一个DbContext实例。我想出的解决方案之一是创建一个HttpModule,该将在BeginRequest事件处理程序中初始化HttpContext.Current.Items上下文的实例,然后在EndRequest事件处理程序中释放它。

但是,上述方法带来了一个问题:我需要在我的数据层和业务层中引用System.Web,以便获取存储的DbContext实例。这可能没问题,但我宁愿避免走那条路。如果我想从非 Web 应用程序引用和使用数据层和业务层,该怎么办?

有什么想法吗?

您可以使用依赖注入。只需使用方法创建接口IContextHolder即可获取上下文并将实例从 Web 应用程序注入到下层。对于不同类型的应用程序,此接口的实现会有所不同 - 它将包装对上下文实例的实际存储的访问。

最简单的

解决方案之一是将对数据上下文的访问包装在外观/网关类的静态属性中。

这样,在 Web 应用程序中,属性可以访问HttpContext.Current.Items并将上下文存储在其中。另一方面,如果缺少 http 上下文,则可以为非 Web 应用程序实现任何其他生存期管理策略。

public static TheDbContext Current {
  get {
     if ( HttpContext.Current != null ) {
        // lifetime management for a web app
        // e.g. with the Items container
     }
     else {
        // lifetime management for a non-web app
     }
  }
}

外观本身不必是数据层的一部分,您不必在数据层中引用System.Web

最新更新