【问题标题】:.NET Core 3 dependency injection in custom validation [duplicate].NET Core 3 自定义验证中的依赖注入 [重复]
【发布时间】:2020-09-20 06:08:36
【问题描述】:

我想在 .NET Core 中创建一个名为 CheckIfEmailExists 的自定义验证属性。我想确保用户不在我的数据库中。所以这是我创建的用户视图模型:

public class CreateUserViewModel
{
    public readonly UserManager userManager;

    public CreateUserViewModel()
    {
    }

    public ExtendedProfile ExtendedProfile { get; set; }

    public User User { get; set; }

    public int SchemeId { get; set; }

    public SelectList Schemes { get; set; }

    [Required]
    [EmailAddress(ErrorMessage = "Invalid Email Address")]
    [CheckIfEmailExists()]
    [Display(Name = "Email Address")]
    public string Email { get; set; }

    [DataType(DataType.EmailAddress)]
    [Display(Name = "Confirm Email Address")]
    public string ConfirmEmail { get; set; }

}

这是我的自定义验证:

public class CheckIfEmailExists : ValidationAttribute
{
    private readonly UserManager _userManager;

    public CheckIfEmailExists(UserManager userManager)
    {
        var _userManager = userManager;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var user = (User)validationContext.ObjectInstance;

        var result = _userManager.FindByEmailAsync(user.Email).Result;

        //do something 

        return ValidationResult.Success;
    }
}

在我的电子邮件属性上添加自定义验证时出现错误,错误是我必须将 usermanager 对象传递给自定义类构造函数。

为什么我的应用不只注入对象本身?

有没有一种方法可以在我的自定义类中创建用户管理器对象而不耦合类?

我应该只在我的控制器中访问我的数据库吗?

【问题讨论】:

标签: asp.net-core validation dependency-injection asp.net-core-3.0


【解决方案1】:

来自 Nikki9696 的上述评论帮助了我,现在我知道如何在我的自定义验证属性中获取我的用户管理器和 dbcontext。

public class IsEmailInDatabase : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var context = (DatabaseContext)validationContext.GetService(typeof(DatabaseContext));

        if (value == null)
        {
            return null;
        }
        else
        {
            var results = context.Users.AnyAsync(x => x.Email == value.ToString());

            if (results.Result)
            {
                return new ValidationResult("This email address already exists in our database");
            }

            return null;
        }
    }
}

【讨论】:

    猜你喜欢
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 2013-07-14
    • 2016-05-22
    • 1970-01-01
    • 2020-05-21
    相关资源
    最近更新 更多