asp.net mvc 4 - 好的是每个线程共享DbContext?

use*_*961 4 asp.net-mvc entity-framework dependency-injection unity-container dbcontext

每个Web请求一个DbContext ...为什么?

我的理解是不应该在并发Web请求之间共享DbContext实例,所以绝对不能跨线程.但是如何在非并发Web请求中共享它呢?

由于线程敏捷性(ASP.Net中线程敏捷性的含义是什么?),我是否正确,一个线程可以在它死之前处理多个Web请求?

如果是这样,依赖为每个线程注入DbContext实例是否安全?

原因是我使用Unity,它不包括每个请求的生命周期选项.从MVC,EF - DataContext单例实例Per-Web-Request在Unity中,我想我可以使用自定义LifetimeManager; 我只是想知道使用PerThreadLifetimeManager是否安全和充足.

Ste*_*ven 6

依赖为每个线程注入DbContext实例是否安全?

这取决于.如果您的想法是DbContext每个Web请求都有一个,并且应用程序的一致性取决于它,那么DbContext每个线程有一个是个坏主意,因为单个Web请求仍然可以获得多个DbContext实例.而且,由于ASP.NET池线程,被每个线程缓存的情况下,将现场为整个应用程序,这是一个非常糟糕的时间DbContext(如解释在这里).

另一方面,您可能能够提出一种缓存方案,确保DbContext单个Web请求使用单个,并在请求完成时返回到池,以便其他Web请求可以获取它.这基本上是.NET中连接池的工作方式.但是由于DbContext实例缓存数据,这些数据会很快变得陈旧,所以即使你能够提出一个线程安全的解决方案,你的系统仍然会以不一致的方式运行,因为在一些看似随机的时刻,旧的数据显示为用户,在后续请求中显示新数据.

我认为可以DbContext在Web请求开始时清除缓存,但这基本上与DbContext为该请求创建新缓存相同,但性能要低得多.

我只是想知道使用PerThreadLifetimeManager是否安全和充足.

不,由于上述原因,它不安全.

但实际上很容易在每个Web请求的基础上注册DbContext:

container.Register<MyApplicationEntities>(new InjectionFactory(c => {
    var context = (MyApplicationEntities)HttpContext.Current.Items["__dbcontext"];

    if (context == null) {
        context = new MyApplicationEntities();
        HttpContext.Current.Items["__dbcontext"] = context;
    }

    return context;
})); 
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

2888 次

最近记录:

12 年,3 月 前