SimpleInjector e FluentValidationFactory
Estou tentando automatizar a validação dos meus modelos de exibição, sei que posso apenas adicionar um atributo para especificar minha validação, mas há uma opção para configurar uma fábrica para automatizar tudo isso, observei:esta resposta e veio com isso usando o injetor simples 3.1:
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;
}
}
Então o modelo de visualização pode ser algo como
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);
}
}
No entanto, a variável de implementação é sempre nula, eu também tentei o RegisterCollection, mas ainda tenho o mesmo problema, parece que o injetor simples não sabe resolver o IValidator quando o validador herda de AbstractValidator (esta é a classe que implementa o IValidator)