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 關注
- 155 瀏覽
添加回答
舉報