.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”依赖注入的自定义范围。控制器