在 Blazor Server Side 应用中, dbContext 是通过注入服务来获取的,而注入的服务都是单例的形式,因此不需要考虑线程安全的问题。同时,C# 中的 DbContext 类是线程安全的,因此在多个线程中同时使用同一个 dbContext 实例也不会有问题。以下是一个使用从 ValidationContext.GetService 检索到的 dbContext 实例的代码示例:
[Validator(typeof(MyModelValidator))]
public class MyModel
{
public int Id { get; set; }
public string Name { get; set; }
}
public class MyModelValidator : AbstractValidator
{
private readonly MyDbContext _dbContext;
public MyModelValidator(ValidationDbContext dbContext)
{
_dbContext = dbContext;
RuleFor(x => x.Name).MustAsync(async (model, name, cancellation) =>
{
return !await _dbContext.MyModels
.AnyAsync(x => x.Name == name && x.Id != model.Id, cancellationToken: cancellation);
}).WithMessage("Name already exists");
}
}
在上述代码中,我们从 ValidationContext 中注入了 MyDbContext,然后在 MyModelValidator 中使用了它来执行异步验证逻辑。由于使用注入的 MyDbContext 实例,因此不需要考虑线程安全的问题。