2 回答
TA贡献1836条经验 获得超5个赞
如果您不使用任何其他注入服务(这些服务也使用您的 DBContext),那么作用域服务和瞬态服务之间没有区别。
但是,如果您使用其他注入服务,并且 DBContext 上有“瞬态”,则每个服务都会获得自己的实例。为了避免这种情况,您应该始终在 DBContext 上使用“scoped”。
在具有以下代码的示例中,对于“瞬态”EmployeeContext,每个请求都会有两个实例:
public class MyService : IMyService
{
public MyService(EmployeeContext context)
{
// ...
}
}
public class EmployeeController : Controller
{
private EmployeeContext _context;
private _myService;
public EmployeeController(EmployeeContext context, IMyService myService)
{
_context = context;
_myService = myService;
}
public ActionResult Index()
{
return View(context.Employees.ToList());
}
...//other action methods that access context's DbSet
}
TA贡献1825条经验 获得超6个赞
从官方文档来看,DBContext
被设计为短暂且非线程安全的。如果 DBContext 实例处理得当,它们不会导致并发问题。通常,底层并发问题应该来自 SQL TCP 连接池。创建多少个 DBContext 实例对于并发问题并不重要。但它确实在堆中创建对象,这意味着如果您可以完全控制代码流并保证不会出现任何线程安全问题,则应该限制 DBContext 对象的创建。但根据我的理解,不应在请求线程之间共享实例,因为这会导致线程安全问题的损坏。
- 2 回答
- 0 关注
- 115 浏览
添加回答
举报