![](/img/trans.png)
[英]How to inject dependencies into a FluentValidation AbstractValidator constructor, with Ninject and MVC4?
[英]MVC C# - FluentValidation Composite Validator for multiple AbstractValidator<T>
我有一個MVC應用程序,每個視圖模型都有許多AbstractValidator<T>
。 這是設計SimpleInjector
,因為我使用SimpleInjector
注入查詢以訪問我們的數據庫,並且我不想在一個驗證器中使用構造函數進行注入。 我在下面創建了用於每個視圖模型的驗證器的類,但它沒有調用我的When
和其他自定義驗證規則,僅調用了簡單規則。 任何幫助將不勝感激。 謝謝。
public class CompositeValidator<T> : AbstractValidator<T>
{
private ICollection<IValidator> _validators = new List<IValidator>();
public CompositeValidator(IEnumerable<IValidator<T>> validators = null)
{
if (validators == null) return;
foreach (var validator in validators)
{
_validators.Add(validator);
var enumerator = validator.GetEnumerator();
while (enumerator.MoveNext())
{
AddRule(enumerator.Current);
}
}
}
public override ValidationResult Validate(ValidationContext<T> context)
{
var errorsFromOtherValidators = _validators.SelectMany(x => x.Validate(context).Errors);
return new ValidationResult(errorsFromOtherValidators );
}
}
這是兩個驗證器的示例
public class PersonValidator : AbstractValidator<PersonVm>
{
public PersonValidator()
{
RuleFor(model => model.FirstName).NotEmpty();
RuleFor(model => model.LastName).NotEmpty();
}
}
public class PersonMustBeRegisteredValidator : AbstractValidator<PersonVm>
{
private readonly IQuery<PersonExists> _query;
public PersonMustBeRegisteredValidator(IQuery<ReturnPerson> query)
{
_query = query;
Custom(model =>
{
var person = _query.Select(new { model.Id });
if (person == null) return new ValidationFailure("Id", "Person does not exist");
return null;
});
}
}}
這實際上有效。 我發現我忘記的驗證攔截器沒有觸發我的驗證。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.