升级解决方案以使用FluentValidation Ver 10异常问题



请您帮助我解决FluentValidation问题。我有一个旧的桌面应用程序,我几年前写的。我使用了FluentValidation Ver 4,现在我正试图升级此应用程序以使用.Net framework 4.8和FluentValidationVer 10,但不幸的是,由于一个仍然无法修复的异常,我无法继续。

我有这个客户类别:

class Customer : MyClassBase
{
string _CustomerName = string.Empty;
public string CustomerName
{
get { return _CustomerName; }
set
{
if (_CustomerName == value)
return;
_CustomerName = value;
}
}

class CustomerValidator : AbstractValidator<Customer>
{
public CustomerValidator()
{
RuleFor(obj => obj.CustomerName).NotEmpty().WithMessage("{PropertyName} is Empty");
}
}
protected override IValidator GetValidator()
{
return new CustomerValidator();
}
}

这是我的基类:

class MyClassBase
{
public MyClassBase()
{
_Validator = GetValidator();
Validate();
}
protected IValidator _Validator = null;
protected IEnumerable<ValidationFailure> _ValidationErrors = null;
protected virtual IValidator GetValidator()
{
return null;
}
public IEnumerable<ValidationFailure> ValidationErrors
{
get { return _ValidationErrors; }
set { }
}
public void Validate()
{
if (_Validator != null)
{
var context = new ValidationContext<Object>(_Validator);
var results = _Validator.Validate(context); **// <======= Exception is here in this line**
_ValidationErrors = results.Errors;
}
}
public virtual bool IsValid
{
get
{
if (_ValidationErrors != null && _ValidationErrors.Count() > 0)
return false;
else
return true;
}
}
}

当我运行应用程序测试时,我得到以下异常:

System.InvalidOperationException HResult=0x80131509消息=无法验证"CustomerValidator"类型的实例。此验证器可以仅验证"Customer"类型的实例。来源=FluentValidationStackTrace:位于FluentValidation.ValidationContext1.GetFromNonGenericContext(IValidationContext context) in C:ProjectsFluentValidationsrcFluentValidationIValidationContext.cs:line 211 at FluentValidation.AbstractValidator1.FluentValidation.IValidator.Valide(IValidationContext上下文(

请问这里有什么问题?我该如何解决?

谢谢

您的总体实现不是我认为的正常用法,但问题是您要求FV验证验证器实例,而不是客户实例:

var context = new ValidationContext<Object>(_Validator);
var results = _Validator.Validate(context);

如果您将其更改为:,它应该开始工作

var context = new ValidationContext<object>(this);
var results = _Validator.Validate(context);

除非在基类中引入一个泛型参数,或者使用反射创建它,否则在验证上下文中只能使用object参数。

最新更新