Не удалось разрешить службу для типа для класса generi c - PullRequest
1 голос
/ 25 января 2020

Я использую FluentValidation , и я создал обобщенный класс c, например, так:

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.StrategyValidator' при попытке активировать '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<>));

Ни один из них не работал. Кто-нибудь знает, что я могу сделать, чтобы зарегистрировать все мои валидаторы, а не регистрировать их один за другим?

1 Ответ

2 голосов
/ 25 января 2020

Вы не указали, как выглядит служба, требующая DI, но вы можете зарегистрировать свои валидаторы вручную следующим образом: services.AddSingleton(typeof(StrategyValidator))

Кроме того, вы можете просто использовать общие формы c в своем услуги, например, вместо запроса StrategyValidator вы должны запросить GenericValidator<StrategyViewModel>

Но обычно Fluent предоставляет простой способ сделать это, используя методы расширения

например

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

Примечание: это зарегистрирует все текущие валидаторы, которые находятся в той же сборке, что и Startup.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...