我在ConfigureServices
中添加了我的数据库,如下所示:
var connection = Configuration.GetConnectionString("DefaultConnection");
services.AddDbContext<xDBContext>(options => options.UseSqlServer(connection));
我的控制器会自动传递xDBContext
的实例。但是如果我将它添加到我的viewmodel中,我不会收到错误,而是在构造函数中传递null:
public class UserRegisterViewModel : IValidatableObject
{
private readonly xDBContext _context;
[MinLength(6)]
[Required]
public string UserName { get; set; }
[EmailAddress]
[Required]
public string Email { get; set; }
[MinLength(6)]
[Required]
public string Password { get; set; }
// Does not matter wether I use [FromServices], I still get a null
public UserRegisterViewModel([FromServices] xDBContext context) // gets passed a null
{
_context = context;
}
private async Task<IEnumerable<ValidationResult>> ValidateAsync(ValidationContext validationContext)
{
var results = new List<ValidationResult>();
bool userNameExists = await _context.User.AnyAsync(x => x.UserName == UserName);
bool emailExists = await _context.User.AnyAsync(x => x.Email == Email);
if(userNameExists)
{
results.Add(new ValidationResult("Username already being used!"));
}
if(emailExists)
{
results.Add(new ValidationResult("Email already being used!"));
}
return results;
}
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
Func<ValidationContext, Task<IEnumerable<ValidationResult>>> val =
async (context) =>
{
return await ValidateAsync(context);
};
return val(validationContext).Result;
}
}
UserRegisterViewModel
通过从api POST调用
public IActionResult RegisterUser([FromBody] UserRegisterViewModel vmodel) {
//...
}
通过依赖注入将xDBContext
传递给viewmodel构造函数需要做什么?
虽然validationContext.GetService
确实有效,但它也使我的ViewModel验证依赖于依赖注入,这反过来使单元测试变得更难。有没有办法通过构造函数传递上下文?或者更好的方法来进行数据库检查?