У меня есть решение, которое я использую в данный момент. Я использую Свободное подтверждение и все еще привыкаю к нему. Я могу привести пример простого сценария, который у меня есть. возможно это поможет. У меня есть пользовательский класс, со свойством адрес объекта. В какой-то момент я хочу проверить только данные пользователя (имя, адрес электронной почты, пароль и т. Д.), А в другом состоянии я хочу проверить адрес пользователя (первая строка, почтовый индекс и т. Д.).
Классы выглядят так:
public class User {
public virtual string Name { get; set; }
public virtual string Email { get; set; }
public virtual string Password { get; set; }
public virtual Address Address { get; set; }
}
public class Address {
public virtual string Address1 { get; set; }
public virtual string PostCode { get; set; }
}
У меня есть два (упрощенных) валидатора, один для адреса и один для пользователя:
public AddressValidator() {
RuleFor(address => address.Address1)
.NotNull()
.WithMessage("Please enter the first line of your address");
RuleFor(address => address.PostCode)
.NotNull()
.WithMessage("Please enter your postcode")
.Matches(UK_POSTCODE_REGEX)
.WithMessage("Please enter a valid post code!");
}
public UserValidator() {
RuleFor(user => user.FirstName)
.NotNull()
.WithMessage("Please provide a first name")
.Length(3, 50)
.WithMessage("First name too short");
RuleFor(user=> user.Password)
.Length(8, 50)
.WithMessage("Password is too short");
}
Затем я создаю Валидатор модели, например, скажем, у нас есть форма, в которую пользователь вводит адрес, мы создаем AddressModelValidator и можем повторно использовать написанные нами валидаторы:
public AddressModelValidator() {
RuleFor(user => user.id)
.NotNull()
.WithMessage("An error has occured, please go back and try again");
RuleFor(user => user.Address).SetValidator(new AddressValidator());
}
Итак, подумав, вы действительно можете создать несколько хороших моделей и уменьшить дублирование кода проверки!