2010-12-07 32 views
6

Estoy escribiendo una utilidad de validación de datos para uno de nuestro departamento que tiene el siguiente requisito. - Adición dinámica de nueva entidad comercial - Adición dinámica de nuevas validaciones a una entidad. - Una interfaz de usuario para mostrar la lista de la entidad comercial y su validación en - El usuario tendrá la opción de iniciar la validación en la validación de todas las entidades comerciales seleccionadas o seleccionadas. - La interfaz de usuario mostrará un mensaje de error de validación si falla cualquier validación. - El sistema debe pasar a la siguiente validación incluso si falla alguna de las validaciones, por lo que todas las validaciones configuradas son validadas.Patrón de diseño de validación

Después de buscar en internet, encontré los siguientes 2 patrones de diseño prometedor que satisfacen mis necesidades de negocio, un patrón de Decorador de identificación y otro es la Cadena de mando (también conocida como Cadena de responsabilidad). Ahora mi pregunta es ¿cuál es mejor? Alguien tiene una idea mejor?

Gracias

+0

Creo que podría necesitar reformular su pregunta. ¿Puedes aclarar lo que quieres hacer con, digamos, el patrón de Cadena de mando? –

Respuesta

7

creo que lo que quiere es la Specification Pattern. Por lo que deberías hacer algo como esto:

public void StartDateNotInPastSpecification : ISpecification<ISomeBusinessObject> 
{ 
    public bool IsSatisfiedBy(ISomeBusinessObject myBusinessObject) 
    { 
    return myBusinessObject.StartDate >= DateTime.Now; 
    } 
} 

Lo bueno de este patrón es que cada regla es fácilmente comprobable en forma aislada y usted tiene que elegir el momento de aplicar las reglas de validación (a diferencia de algunos marcos que imponen esta decisión sobre ti).

4

Estoy usando el patrón de especificación también. Esta es una implementación básica de esto.

public class Specification<T, E> : ISpecification<T, E> 
{ 
    private Predicate<T> predicate; 

    public Specification(Predicate<T> predicate) 
    { 
     this.predicate = predicate; 
    } 

    public bool IsSatisfiedBy(T candidate) 
    { 
     return this.predicate.Invoke(candidate); 
    } 
} 

Con esta implementación, acabo de pasar un predicado en el constructor, como esto:

var specification = new Specification<SomeDomainClass>(x => x.SomeDomainBoolMethod()); 

En lugar de varias clases (una por cada condición en mi dominio), tengo varios métodos bool en mis objetos comerciales

+0

¿podría agregar/reescribir el código de uso de muestra para incluir más nombres de clases/métodos explicativos? –