我一直在考虑如何在分层应用程序中使用每个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
。