использование валидатора nhibernate - PullRequest
1 голос
/ 29 января 2011

Скажем, у меня есть класс объекта значения FullName, который используется в качестве свойства в классе сущности Employee. FullName может иметь среднюю букву, псевдоним и т. Д .; но с точки зрения домена я хотел бы только обеспечить, чтобы свойства FirstName и LastName для FullName оценивались.

Я хочу выразить это как часть объекта EmployeeValidator: ValidationDef {Employee}, а не атрибута.

Нужно ли сначала создать валидатор класса для FullName (т. Е. FirstAndLAstNameRequired), а затем сказать, что свойство FullName в Employee является допустимым (используя некоторую неопределенную форму ValidAttribute)?

Кроме того, кажется, что эта документация все еще лучшая, но она выглядит устаревшей в три года. Что-нибудь новее, что я пропустил?

Приветствия
Berryl

UPDATE

Я еще не понял этого, но я нашел наиболее вероятный источник информации о NHib Validator здесь: http://fabiomaulo.blogspot.com/search/label/Validator

Вот некоторый псевдо-код, чтобы лучше выразить вопрос:

/// <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 Ответ

1 голос
/ 30 января 2011

Для проверки 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;
    });
}
}
...