2011-01-29 70 views
1

假设我有一个值对象类FullName,它用作Employee实体类中的一个属性。 FullName可能有中间名,昵称等;但从域的角度来看,我只想强调FullName的FirstName和LastName属性是重要的。nhibernate验证器用法

我想将其表示为EmployeeValidator的一部分:ValidationDef {Employee}对象,而不是属性。

我是否首先需要为FullName(即FirstAndLAstNameRequired)创建一个类验证程序,然后说Employee中的FullName属性是Valid(使用一些Loquacious形式的ValidAttribute)?

顺便说一句,看起来this documentation仍然是最好的,但它确实看起来过了三岁。我错过了更新的东西吗?

干杯,
Berryl

UPDATE

我还没有想通了这一点,但我发现什么是可能在这里NHib验证信息的最佳来源: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!! 
    } 
} 

UPDATE FOR DAV ID

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

要得到验证的全名时,验证员工,我想你会做类似如下:

public class EmployeeValidator : ValidationDef<Employee> 
{ 
    public EmployeeValidator() 
    { 
     Define(x => x.FullName).IsValid(); 
     Define(x => x.FullName).NotNullable(); // Not sure if you need this 
    } 
} 

然后全名验证只会是这样的:

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; 
    }); 
} 
} 
+0

我同意你的观点,基本上,除了你的第一行不能编译(尽管看起来只是需要的东西)。请参阅发布的最新更新。 – Berryl 2011-01-30 16:21:36