【发布时间】:2022-01-06 13:57:50
【问题描述】:
控制器方法调用此 ValidateUser 方法。例如验证用户。然后该服务调用 dbcontext。例如进行 db 查询。
什么范围(transient/scoped/singleton)适合服务类?
据我了解,假设如果范围设置为单例,那么在应用程序的整个生命周期中将只有 1 个此类实例。即使默认情况下 DbContext 是作用域的,在整个生命周期内(来自此服务类的实例)只会存在 1 个连接。
假设我设置为瞬态,那么对服务类的每个请求都会创建一个新的类实例。由于 dbcontext 是作用域的,因此它将是 1 个用户请求生命周期的 1 个实例。
假设我设置为作用域,那么每个用户对服务类的请求都会创建该类的新实例。由于 dbcontext 是作用域的,它将是 1 个用户请求生命周期的 1 个实例
什么是线程安全问题?
namespace MyApp.Services
{
public class ValidateService : IValidateService
{
private readonly MyAppContext _context;
public ValidateService(MyAppContext context)
{
_context = context;
}
public bool ValidateUser(UserDTO user)
{
return await _context.Users.AnyAsync(x => x.username == user.UserName);
}
}
}
【问题讨论】:
-
我不知道,我认为它是 variab.. 哦
-
顺便提一下,如果包含Service类的定义,这个问题可能会更好接受
-
我请求重新打开这个问题。
-
您是否在问“如果我将 Y 限定为 a) 瞬态,b) 限定范围并使 N Y的用途?”还是您在问“为什么 DbContext 不是线程安全的?”
-
我已经给出了我对第 1 部分的理解 - 我的问题是第 2 部分 - 也就是说 - 为什么在单例的情况下 DbContext 不是线程安全的,以及在服务范围内它如何成为线程安全的类是作用域的或瞬态的。