.NET Core 3 自定义验证中的依赖注入 [重复]

Posted

技术标签:

【中文标题】.NET Core 3 自定义验证中的依赖注入 [重复]【英文标题】:.NET Core 3 dependency injection in custom validation [duplicate] 【发布时间】: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 对象传递给自定义类构造函数。

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

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

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

【问题讨论】:

试试这个答案:***.com/questions/39627956/… 【参考方案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;
        
    

【讨论】:

以上是关于.NET Core 3 自定义验证中的依赖注入 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

《ASP.NET Core 6框架揭秘》实例演示[04]:自定义依赖注入框架

.Net Core:“Scoped”依赖注入的自定义范围。控制器

ASP.NET Core 2 中的依赖注入引发异常

.NET Core反射获取带有自定义特性的类,通过依赖注入根据Attribute元数据信息调用对应的方法

.net core 3 依赖注入服务作为“配置”的参数

.NET Core 3.1 中的依赖注入具有多种实现 [重复]