Używam FluentValidation do sprawdzania poprawności kolekcji wewnątrz obiektu, porównując element elementów kolekcji z elementem obiektu nadrzędnego.Przekaż element obiektu do konstruktora SetValidator FluentValidator
Celem wyników jest otrzymanie informacji o poprawności dla każdego uszkodzonego elementu w kolekcji, a nie tylko o niepowodzenie w zbiorze.
Mam zamówienie na oprogramowanie, zawierające listę elementów oprogramowania. Jeśli zamówienie dotyczy starego systemu, wybrane oprogramowanie może być tylko starszym oprogramowaniem, i na odwrót, system nie będący starszym może mieć tylko nie istniejące oprogramowanie.
Mój model:
public class SoftwareOrder
{
public bool IsLegacySystem;
public List<SoftwareItem> Software;
(...other fields...)
}
public class SoftwareItem
{
public bool Selected;
public bool IsLegacySoftware;
public int SoftwareId;
}
Walidatory:
public class SoftwareOrderValidator : AbstractValidator<SoftwareOrder>
{
public SoftwareOrderValidator()
{
(..other rules..)
When(order => order.IsLegacySystem == true,() =>
{
RuleForEach(order => order.SoftwareItem)
.SetValidator(new SoftwareItemValidator(true));
});
When(order => order.IsLegacySystem == false,() =>
{
RuleForEach(order => order.SoftwareItem)
.SetValidator(new SoftwareItemValidator(false));
});
}
}
public class SoftwareItemValidator : AbstractValidator<SoftwareItem>
{
public SoftwareItemValidator(bool IsLegacySystem)
{
When(item => item.Selected,() =>
{
RuleFor(item => item.IsLegacySoftware)
.Equal(IsLegacySystem).WithMessage("Software is incompatible with system");
});
}
}
Jak widać, mam zrealizować to przez posiadające Gdy dla każdego warunku. Działa, ale narusza DRY i nie jest praktyczne w użyciu w sytuacji, w której występują więcej niż dwa warunki.
bym idealnie chciałby mieć jeden RuleForEach, że może to zrobić, nie ma whens potrzebne, coś jak:
RuleForEach(order => order.SoftwareItem)
.SetValidator(new SoftwareItemValidator(order => order.IsLegacySystem));
Ale nie widzę żadnego sposobu, aby przejść IsLegacySystem do tego konstruktora.
tak słodko podchwytliwie – pirimoglu