我想自動化我的視圖模型的驗證,我知道我可以添加一個屬性來指定我的驗證,但有一個選項來設置一個工廠來自動化所有,我看着: 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