Проверьте унаследованные классы, используя FluentValidation |C # Web API - PullRequest
0 голосов
/ 02 февраля 2019

Я хочу создать валидацию для моего c # web api.В моем первом вопросе вы можете увидеть мои модели: Нажмите здесь

Теперь я создал следующие валидаторы:

public class AnimalValidator<T> : AbstractValidator<T> where T : Animal
{
    private ISessionService sessionService;

    public AnimalValidator(ISessionService sessionService)
    {
         this.sessionService = sessionService;

         RuleSet("Create", () =>
         {
             // some validation
         });

         RuleSet("Edit", () =>
         {
             // some validation
         });
     }
 }

и ...

public class DogValidator : AnimalValidator<Dog>
{
   private ISessionService sessionService;

   public DogValidator(ISessionService sessionService) // Error: There is no argument given that corresponds to the required formal parameter 'sessionService'
   {
       this.sessionService = sessionService;

       RuleSet("Create", () =>
       {
           // some validation
       });

       RuleSet("Edit", () =>
       {
           // some validation
       });
    }
  }

и ...

public class CatValidator : AnimalValidator<Cat>
{
   private ISessionService sessionService;

   public CatValidator(ISessionService sessionService) // Error: There is no argument given that corresponds to the required formal parameter 'sessionService'
   {
       this.sessionService = sessionService;

       RuleSet("Create", () =>
       {
           // some validation
       });

       RuleSet("Edit", () =>
       {
           // some validation
       });
   }
 }

В моем первом вопросе, как упомянуто выше, я сделал код, как в ответе.

Я пытаюсь вызвать проверку следующим образом:

if (validationService.IsValid(animal, ruleSetNames: new List<string>() { 
"Create" }, propertyNames: null))
{ // do stuff here }

Проблема в том, что это животное типа object.

Нужна ваша помощь.Как избавиться от ошибок валидатора и как правильно вызвать валидацию?

Заранее спасибо.

РЕДАКТИРОВАТЬ:

Как сделатьЯ должен зарегистрировать свой валидатор в ValidationFactory?В настоящее время у меня есть:

validators.Add(typeof(IValidator<Animal>), new ValidationFactoryItem(typeof(AnimalValidator), new object[] { sessionService }));
validators.Add(typeof(IValidator<Dog>), new ValidationFactoryItem(typeof(DogValidator), new object[] { sessionService }));
validators.Add(typeof(IValidator<Cat>), new ValidationFactoryItem(typeof(CatValidator), new object[] { sessionService }));

Я всегда получаю сообщение об ошибке:

System.InvalidOperationException: 'Для данного типа не зарегистрирован валидатор.'

Кажется, это тип object, но это должен быть либо собака, либо кошка ...

Пожалуйста, помогите мне.:)

1 Ответ

0 голосов
/ 04 февраля 2019

Вы подразумевали, что классы будут называться DogValidator и CatValidator?Потому что ваши конструкторы ссылаются на это, а ваши классы называются Dog и Cat.

Когда в вашем базовом классе нет пустого конструктора, вам нужно передать ему параметры конструктора из вашего подкласса с использованием синтаксиса ": base ("т.е. я думаю, что DogValidator должен выглядеть примерно так:

public class DogValidator : AnimalValidator<Dog>
{
   private ISessionService sessionService;

   public DogValidator(ISessionService sessionService) : base(sessionService)
   {
       this.sessionService = sessionService;

       RuleSet("Create", () =>
       {
           // some validation
       });

       RuleSet("Edit", () =>
       {
           // some validation
       });
    }
  }  

Обратите внимание, что вы в настоящее время также храните sessionService дважды как в DogValidator, так и в AnimalValidator, но исправление имени класса и добавление вызова конструктора базового класса должно привести к сортировкеваша проблема компиляции.

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