无法解析通用类型的服务 class

Unable to resolve service for type for generic class

我正在使用 FluentValidation,并且我创建了一个通用的 class,如下所示:

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: Unable to resolve service for type 'Api.Controllers.Strategies.StrategyValidator' while attempting to activate 'Api.Controllers.Strategies.Handlers.StrategySaveHandler'.

我的 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<>));

None 他们成功了。 有谁知道我可以做什么来注册我所有的验证器而不是一个一个地注册它们?

您没有提供需要 DI 的服务是什么样的,但您可以 像这样手动注册你的验证器:services.AddSingleton(typeof(StrategyValidator))

此外,您可能只想在您的服务中利用通用表单,例如,您应该请求 GenericValidator<StrategyViewModel>

而不是请求 StrategyValidator

但一般来说,Fluent 提供了一种使用其扩展方法执行此操作的简单方法

例如

services.AddMvc(config =>
{
    config.Filters.Add(new AuthorizeFilter(authorizationPolicy));
}).AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<Startup>())

注意: 这将注册与 Startup 位于同一程序集中的所有流畅验证器。