为每个线程依赖注入一个 DbContext 实例是否安全?
这取决于。如果您的想法是DbContext
每个 Web 请求都有一个,并且您的应用程序的一致性取决于它,那么DbContext
每个线程有一个不是一个好主意,因为单个 Web 请求仍然可以获取多个 DbContext 实例。并且由于 ASP.NET 池线程,每个线程缓存的实例将在整个应用程序的持续时间内存在,这对 a 非常不利DbContext
(如此处所述)。
另一方面,您可能会想出一个缓存方案,以确保DbContext
单个 Web 请求使用一个,并在请求完成时返回到池中,以便其他 Web 请求可以获取它。这基本上就是 .NET 中连接池的工作方式。但是由于DbContext
实例缓存数据,该数据很快就会变得陈旧,因此即使您能够提出线程安全的解决方案,您的系统仍然会以不一致的方式运行,因为在某些看似随机的时刻,旧数据会显示为用户,同时在以下请求中显示新数据。
我认为可以DbContext
在 Web 请求开始时清除 's 缓存,但这基本上与为该请求创建新缓存相同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;
}));