我想自动化我的视图模型的验证,我知道我可以添加一个属性来指定我的验证,但有一个选项来设置一个工厂来自动化所有,我看着: this answer并想出了这个用简单的喷油器3.1:SimpleInjector和FluentValidationFactory
public class CustomValidatorFactory:ValidatorFactoryBase
{
private readonly Container siContainer;
public CustomValidatorFactory(Container siContainer)
{
var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();
this.siContainer = siContainer;
this.siContainer.Register(typeof(IValidator<>), assemblies);
}
public override IValidator CreateInstance(Type validatorType)
{
//var instances = siContainer.GetAllInstances(validatorType);
var implementation = ((IServiceProvider)siContainer).GetService(validatorType);
var validatorInstance = implementation != null ? (implementation as IValidator) : null;
return validatorInstance;
}
}
然后视图模型可以像
public class Person {
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public int Age { get; set; }
}
public class PersonValidator : AbstractValidator<Person> {
public PersonValidator() {
RuleFor(x => x.Id).NotNull();
RuleFor(x => x.Name).Length(0, 10);
RuleFor(x => x.Email).EmailAddress();
RuleFor(x => x.Age).InclusiveBetween(18, 60);
}
}
但是实施变量总是空,我也试着RegisterCollection,但仍然有似乎同样的问题喜欢简单的喷油器不知道如何当验证从AbstractValidator继承解决IValidator(这是实现IValidator类)
你为什么要在工厂的构造函数中注册验证器?我很惊讶这个代码甚至可以工作。我想不出为什么你会想要这样的理由。您应该将此代码放在应用程序的组合根目录中。 –
你能展示一个最小可重现的例子吗? CustomValidatorFactory如何注册以及它如何被调用?实际提供给fsctory的参数是什么?工厂是否提供了Typeof(Person)或typeof(IValidator)? –
Steven
@ Ric.Net,这个CustomValidatorFactory可以被认为是组合根的一部分,所以在这里做注册似乎很好。 – Steven