我正在使用 FluentValidation ,并且已经创建了一个通用类,如下所示:
public class GenericValidator<T>: AbstractValidator<T>
{
protected override bool PreValidate(ValidationContext<T> context, ValidationResult result)
{
if (context.InstanceToValidate != null) return true;
result.Errors.Add(new ValidationFailure("model", Resources.NullModelError));
return false;
}
}
当我尝试使用我的应用程序时,它返回此错误:
System.InvalidOperationException:尝试激活“ Api.Controllers.Strategies.Handlers.StrategySaveHandler”时,无法解析类型为“ Api.Controllers.Strategies.StrategyValidator”的服务。
我的StrategyValidator
看起来像这样:
public class StrategyValidator : GenericValidator<StrategyViewModel>
{
public StrategyValidator()
{
RuleFor(model => model.Url).NotEmpty();
}
}
我为不同实体提供了其中一些,我想全部注册。 我尝试了几种方法:
services.AddSingleton(typeof(GenericValidator<>));
services.AddSingleton(typeof(GenericValidator<>), typeof(GenericValidator<>));
services.AddSingleton(typeof(AbstractValidator<>));
services.AddSingleton(typeof(GenericValidator<>), typeof(AbstractValidator<>));
他们都没有工作。 有谁知道我该怎么做才能注册我的所有验证程序,而不是一个一个地注册它们?
答案 0 :(得分:2)
您尚未提供需要DI的服务,但您可以提供
手动注册验证器,如下所示:services.AddSingleton(typeof(StrategyValidator))
另外,您可能只想利用服务中的通用形式,例如,而不是请求StrategyValidator
,而应请求GenericValidator<StrategyViewModel>
但是,通常来说,Fluent使用其扩展方法提供了一种简便的方法
例如
services.AddMvc(config =>
{
config.Filters.Add(new AuthorizeFilter(authorizationPolicy));
}).AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<Startup>())
注意:这将注册与Startup在同一程序集中的所有流利验证器。