use*_*961 4 asp.net-mvc entity-framework dependency-injection unity-container dbcontext
我的理解是不应该在并发Web请求之间共享DbContext实例,所以绝对不能跨线程.但是如何在非并发Web请求中共享它呢?
由于线程敏捷性(ASP.Net中线程敏捷性的含义是什么?),我是否正确,一个线程可以在它死之前处理多个Web请求?
如果是这样,依赖为每个线程注入DbContext实例是否安全?
原因是我使用Unity,它不包括每个请求的生命周期选项.从MVC,EF - DataContext单例实例Per-Web-Request在Unity中,我想我可以使用自定义LifetimeManager; 我只是想知道使用PerThreadLifetimeManager是否安全和充足.
依赖为每个线程注入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 次 |
| 最近记录: |