2011-05-25 35 views
6

Tengo un par de variables que defino en C# por:C# añadir la validación de un método setter

public String firstName { get; set; } 
public String lastName { get; set; } 
public String organization { get; set; } 

Lo que quiero es añadir la validación de estos métodos cuando se intenta establecer un valor. Digamos que va a establecer un valor para firstName, el i debe pasar una expresión regular para establecerse de verdad, de lo contrario se debe lanzar una excepción. ¿Es posible construir esto con esta "sintaxis corta" o debería ir para getters y setters estándar (como en JAVA) y allí validar los datos?

Respuesta

25

Si desea validar cuándo se establece la propiedad, debe utilizar propiedades que no sean automáticas (es decir, los métodos get y set definidos manualmente).

Pero otra forma de validar es tener la lógica de validación separada del objeto de dominio.

class Customer { 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Organization { get; set; } 
} 

interface IValidator<T> { 
    bool Validate(T t); 
} 

class CustomerValidator : IValidator<Customer> { 
    public bool Validate(Customer t) { 
     // validation logic 
    } 
} 

Entonces, se podría decir:

Customer customer = // populate customer 
var validator = new CustomerValidator(); 
if(!validator.Validate(customer)) { 
    // head splode 
} 

Este es el enfoque que prefiero:

  1. Un Customer no debería responsables de validar sus propios datos, que es otra responsibility y por lo tanto debería vivir en otro lado
  2. Diferentes situaciones requieren una lógica de validación diferente para el mismo objeto de dominio.
+3

No estoy de acuerdo, incluso si su validación falla, los datos de sus clientes no son válidos. ¿Qué impide que escriba basura en la base de datos si se estropea la validación externa? – Blindy

+0

@Blindy: su capa de persistencia debe estar conectada con validadores que no persisten si falla la validación. – jason

+0

@Blindy El cliente no debería ser responsable de escribir en la base de datos. Esa sería otra responsabilidad que el cliente no debería tener. – Phil

6

Lo que tiene ahora se llama "auto-propiedades" y solo realiza un simple "obtener/establecer". Con el fin de personalizar el comportamiento de la get o set, tendrá que convertir las propiedades de las propiedades del campo respaldados:

private string _firstName; 
public string FirstName 
{ 
    get {return _firstName;} 
    set 
    { 
     Validate(value); _firstName = value; 
    } 
} 

Tenga en cuenta que he cambiado String a string y capitalizado el nombre de propiedad, en el seguimiento de C# denominación aceptada mejores prácticas.

+0

¿No debería ser Validate (valor)? – TDull

+0

@TDull: Sí, lo arreglé. :-) – StriplingWarrior

0

Tienes que usar la sintaxis completa de la propiedad para esto.

3

No agregaría la validación en el setter en absoluto. Por el contrario, crearía una función llamada validate en su lugar ... de esa manera todo su código de validación está en un lugar bastante disperso en su setters.

Cuestiones relacionadas