【发布时间】:2018-11-05 00:08:42
【问题描述】:
我正在构建一个 ASP.NET Core 2 MVC 应用程序。很多时候我需要利用依赖项来验证用户输入。我希望我的验证方法是可单元测试的,并且我希望能够将模拟的依赖项注入其中。这是我之前在 MVC5 中取得的巨大成功,但无法计算出 ASP.NET Core 2 的等效项。
这就是我在 MVC5 中的做法:
// the view model to be validated
public class MyViewModel {
public string Username { get; set; }
}
// the model validator that will have dependencies injected into it
public class MyViewModelValidator : ModelValidator
{
private IUserService users;
private MyViewModel model;
public MyViewModelValidator(ModelMetadata metadata, ControllerContext controllerContext, IUserService users)
: base(metadata, controllerContext)
{
this.users = users;
this.model = base.Metadata.Model as MyViewModel;
}
public override IEnumerable<ModelValidationResult> Validate(object container)
{
List<ModelValidationResult> errors = new List<ModelValidationResult>();
if (this.users.CheckExists(this.model.Username))
{
errors.Add(new ModelValidationResult() { MemberName = nameof(MyViewModel.Username), Message = "Username is not available" });
}
return errors;
}
}
// this class works out which validator is required for a given model and
// injects the appropriate dependencies that is resolves using unity in my
// in my case
public class ViewModelValidatorProvider : ModelValidatorProvider
{
private IUnityContainer container;
public ViewModelValidatorProvider() => this.container = DependencyResolver.Current.GetService<IUnityContainer>();
public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context)
{
if (metadata.ModelType == typeof(MyViewModel))
yield return new MyViewModelValidator(metadata, context, this.container.Resolve<IUserService>());
}
}
// the provider is hooked up in the app start in Global.asax.cs file
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
ModelValidatorProviders.Providers.Add(new ViewModelValidatorProvider());
}
}
现在我可以创建一个带有模拟依赖项的验证器实例,然后我就走了!遗憾的是 ASP.NET Core 2 没有 ModelValidator 类,到目前为止我发现的所有东西似乎都想通过控制器注入依赖项或在 IValidatableObjects Validate() 函数中解决它们。
在 MVC Core 中可以做到这一点吗?
【问题讨论】:
标签: c# validation asp.net-core dependency-injection asp.net-core-mvc