我应该如何在Web应用程序中对Entity Framework DbContext的依赖注入进行范围化?(InstancePerHttpRequest vs SingleInstance)

Mer*_*rya 5 model-view-controller asp.net-mvc single-instance autofac dbcontext

我已经读过,DbContext对象应该被创建为InstancePerHttpRequest,而不是SingleInstance,因为它的线程不安全,并且它可能会在requets之间消耗过多的资源,从而导致了这种情况.但我使用的是使用DbContext实例的Repository对象.我应该使它们成为InstancePerHttpRequest还是使它们成为SingleInstance并使用DependencyResolver来获取当前的DbContext.

对于Autofac(或任何其他DI),基于DbContext,Repository和Service的Web应用程序,最佳对象创建设计是什么?

另一个问题是,为每个Web请求(例如请求中的10-15个)创建每个存储库或服务的不同DbContext对象有多昂贵?

Not*_*ple 8

DbContext的实例化非常便宜所以我不会太担心获得一个新的时间.

我对DbContext的范围界定问题并不是它的查询隔离线程安全性.因为任何人都可以调用保存更改并将整个对象图提交到数据库,所以您希望确保只在具有特定更改的上下文中调用它.

理解DbContext的另一个关键因素是性能会降低跟踪的项目数量.这意味着如果以单例绑定它,可能会导致一些非常严重的性能问题.(周围有这个,但其真正好方法,注意看我的这个帖子的点击这里)

我个人对Web应用程序的偏好是在HttpRequest的范围内绑定您的上下文和存储库.这意味着只有您当前的请求线程才能保存更改,并且还会限制您可能跟踪的项目数量.

对不起,我的一些术语可能与autofac不匹配,因为我自己是一个ninject人:)