使用 FluentValidation 验证继承 类 | C# 网络 API

Validate inherited classes using FluentValidation | C# Web API

我想为我的 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: 'No validator registered for the given type.'

类型好像是object,但应该是狗或猫...

请帮助我。 :)

您的意思是 classes 被称为 DogValidator 和 CatValidator 吗?因为您的构造函数引用了它,但您的 classes 被称为 Dog 和 Cat。

当你的基础 class 没有空构造函数时,你需要使用“: base(”语法从你的子class 向它传递构造函数参数,即我认为 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
       });
    }
  }  

请注意,您目前还在 DogValidator 和 AnimalValidator 中存储了两次 sessionService,但修复 class 名称并添加基础 class 构造函数调用应该可以解决您的编译问题。