无法为泛型类的类型解析服务

时间:2020-01-25 19:31:11

标签: c# dependency-injection fluentvalidation

我正在使用 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<>));

他们都没有工作。 有谁知道我该怎么做才能注册我的所有验证程序,而不是一个一个地注册它们?

1 个答案:

答案 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在同一程序集中的所有流利验证器。