【发布时间】:2021-12-07 12:04:48
【问题描述】:
我正在使用FluentValidation 来验证一些模型。
这些模型有一个循环引用,所以我试图做这样的事情:
2 个模型:
public class ObjectA
{
public string Name { get; set; }
public ObjectB AnotherObject { get; set; }
}
public class ObjectB
{
public string Name { get; set; }
public ObjectA AnotherObject { get; set; }
}
验证者:
public class ObjectAValidator : AbstractValidator<ObjectA>
{
public ObjectAValidator(IValidator<ObjectB> validator)
{
this.RuleFor(c => c.Name).NotNull();
this.RuleFor(c => c.AnotherObject).SetValidator(validator);
}
}
public class ObjectBValidator : AbstractValidator<ObjectB>
{
public ObjectBValidator(IValidator<ObjectA> validator)
{
this.RuleFor(c => c.Name).NotNull();
this.RuleFor(c => c.AnotherObject).SetValidator(validator);
}
}
class Program
{
static void Main(string[] args)
{
var services = new ServiceCollection();
services.AddValidatorsFromAssemblyContaining<ObjectA>();
var serviceProvider = services.BuildServiceProvider();
using var scope = serviceProvider.CreateScope();
var objetoAValidator = scope.ServiceProvider.GetRequiredService<IValidator<ObjectA>>();
ObjectA test = new()
{
Name = "1Level",
AnotherObject = new()
{
Name = "2Level",
AnotherObject = new()
{
AnotherObject = new()
}
}
};
var validationResult = objetoAValidator.Validate(test);
}
}
上面的代码抛出如下异常:
System.InvalidOperationException: '检测到'FluentValidation.IValidator
' 类型的服务的循环依赖。 FluentValidation.IValidator (ConsoleApp9.ObjectAValidator) -> FluentValidation.IValidator (ConsoleApp9.ObjectBValidator) -> FluentValidation.IValidator '
在这种情况下如何解决循环依赖?
【问题讨论】:
-
最简单的解决方案 - 单独验证。抓取所有 obj A 并验证集合,抓取 B 并验证集合。不要为持有 A 或 B 的内部属性分配验证器。您还可以找到一些帮助 here
标签: c# fluentvalidation