Я пытаюсь автоматизировать проверку моделей моего представления, я знаю, что могу просто добавить атрибут для указания моей проверки, но есть возможность настроить фабрику для автоматизации всего этого, я посмотрел: 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, но до сих пор такая же проблема, кажется как простой инжектор не знает, как решить IValidator когда валидатор наследует от AbstractValidator (Это класс, который реализует IValidator)
Почему вы регистрируете валидаторы в конструкторе завода? Я удивлен, что этот код работает. Я не могу думать ни о какой причине, почему вы этого хотели. Вы должны поместить этот код в свой корневой каталог приложения. –
Можете ли вы показать минимальный воспроизводимый пример? Как зарегистрирована CustomValidatorFactory и как она называется? Что фактически передается параметру fsctory? Является ли завод поставляемым с типом (Person) или typeof (IValidator)? –
Steven
@ Ric.Net, этот CustomValidatorFactory можно считать частью корня композиции, поэтому регистрация здесь кажется прекрасной. – Steven