在控制器.net核心之外使用数据库依赖注入

时间:2017-12-10 11:25:04

标签: c# asp.net visual-studio entity-framework asp.net-core

我在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验证依赖于依赖注入,这反过来使单元测试变得更难。有没有办法通过构造函数传递上下文?或者更好的方法来进行数据库检查?

0 个答案:

没有答案