使用 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 构造函数调用应该可以解决您的编译问题。
我想为我的 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 构造函数调用应该可以解决您的编译问题。