Использование валидатора nhibernate
Скажем, у меня есть класс объекта значения FullName, который используется в качестве свойства в классе сущности Employee. FullName может иметь среднюю букву, псевдоним и т. Д.; но с точки зрения домена я хотел бы только обеспечить, чтобы свойства FirstName и LastName FullName оценивались.
Я хочу выразить это как часть объекта EmployeeValidator: ValidationDef{Employee}, а не атрибута.
Нужно ли мне сначала создать валидатор класса для FullName (т. Е. FirstAndLAstNameRequired), а затем сказать, что свойство FullName в Employee является допустимым (используется некоторая болтливая форма ValidAttribute)?
Кроме того, кажется, что эта документация все еще лучшая, но она выглядит устаревшей в три года. Что-нибудь новее, что я пропустил?
Ура,
Berryl
ОБНОВИТЬ
Я еще не понял этого, но я нашел, что, вероятно, лучший источник информации о NHib Validator здесь: http://fabiomaulo.blogspot.com/search/label/Validator
Вот код psuedo, чтобы лучше выразить вопрос:
/// <summary>A person's name.</summary>
public class FullName
{
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual string MiddleName { get; set; }
public virtual string NickName { get; set; }
}
public class EmployeeValidator : ValidationDef<Employee>
{
public EmployeeValidator()
{
Define(x => x.FullName).FirstAndLastNameRequired(); // how to get here!!
}
}
ОБНОВЛЕНИЕ ДЛЯ ДЭВИДА
public class FullNameValidator : ValidationDef<FullName>
{
public FullNameValidator() {
Define(n => n.FirstName).NotNullable().And.NotEmpty().And.MaxLength(25);
Define(n => n.LastName).NotNullable().And.NotEmpty().And.MaxLength(35);
// not really necessary but cool that you can do this
ValidateInstance
.By(
(name, context) => !name.FirstName.IsNullOrEmptyAfterTrim() && !name.LastName.IsNullOrEmptyAfterTrim())
.WithMessage("Both a First and Last Name are required");
}
}
public class EmployeeValidator : ValidationDef<Employee>
{
public EmployeeValidator()
{
Define(x => x.FullName).IsValid(); // *** doesn't compile !!!
}
}
1 ответ
Для проверки FullName при проверке сотрудника, я думаю, вы должны сделать что-то вроде следующего:
public class EmployeeValidator : ValidationDef<Employee>
{
public EmployeeValidator()
{
Define(x => x.FullName).IsValid();
Define(x => x.FullName).NotNullable(); // Not sure if you need this
}
}
Тогда валидатор FullName будет выглядеть примерно так:
public class FullNameValidator : ValidationDef<FullName>
{
public EmployeeValidator()
{
Define(x => x.FirstName).NotNullable();
Define(x => x.LastName).NotNullable();
}
}
В качестве альтернативы я думаю, что вы могли бы сделать что-то вроде (не проверял синтаксис):
public class EmployeeValidator: ValidationDef<Employee>
{
public EmployeeValidator() {
ValidateInstance.By((employee, context) => {
bool isValid = true;
if (string.IsNullOrEmpty(employee.FullName.FirstName)) {
isValid = false;
context.AddInvalid<Employee, string>(
"Please enter a first name.", c => c.FullName.FirstName);
} // Similar for last name
return isValid;
});
}
}