2012-03-11 21 views
18

Estoy pensando en utilizar el patrón de especificación para fines de validación. Lo difícil es cómo decirle al usuario por qué algunas especificaciones no se cumplieron. ¿Qué pasa si el Specification.IsSatisfiedBy() no solo devolverá un valor bool, sino también el motivo de la falla. Se vería algo como esto:DDD Uso del patrón de especificación para la validación

interface ISpecification<T> 
{ 
    CheckResult IsSatisfiedBy(T candidate); 
} 

donde CheckResult es:

class CheckResult 
{ 
    public bool IsSatisfied { get; } 
    public string FailureReason { get; } 
} 

En Fowler & Evans trabajo hay un concepto de Especificación parcialmente satisfechas cuyo propósito es proporcionar una explicación lo que exactamente no estaba satisfecho. Sin embargo, en ese documento, se implementa como método adicional remainderUnsatisfiedBy que devuelve la especificación que no se logró con el Candidate.

Por lo tanto, la pregunta es: ¿Cuándo se utiliza la especificación para fines de validación, cómo informar al usuario que una determinada especificación no se cumplió? ¿La solución que acabo de presentar es buena?

+0

Antes que nada, ¿está seguro de que la especificación es el camino a seguir? Quiero decir, ¿cada especificación conoce el contexto donde un modelo podría ser o no válido? No puedo decir mucho porque no sé cómo es el dominio. Para una validación simple, creo que está bien, pero eso es lo que están haciendo los atributos de validación de DataAnnotación en este momento. – MikeSW

Respuesta

17

Aunque puede usar sus clases de especificaciones para la validación, le sugiero que las mantenga como conceptos separados dentro de su dominio. Es posible que necesite reutilizar las mismas especificaciones subyacentes, pero debe devolver diferentes "Razones de falla" según el propósito y el contexto. Ver this article para más detalles.

El autor de la publicación mencionada anteriormente también ha compartido amablemente el código a github y ha publicado el código como NCommon. Revisar estas áreas en particular:

Especificaciones:https://github.com/riteshrao/ncommon/tree/v1.2/NCommon/src/Specifications

validaciones: https://github.com/riteshrao/ncommon/tree/v1.2/NCommon/src/Rules (especialmente las clases para ValidationResult y ValidationError)

+1

Agradable. Gracias por la respuesta. – Markus

+0

Me alegro que me haya ayudado, la mejor de las suertes –

+2

El ejemplo de codeinsanity se ve como FluentValidation :) – dariol

4

que tenía el mismo problema. Creo decorador de validación para la especificación (el código es JAVA).

interface Validator<T>{ 
    Respond validate(T t) 
    } 


    class abstract ValidationSpecificationDecorator<T> implements Validator<T> { 
    Specification<T> spec; 

    ValidationSpecificationDecorator(Specification<T> spec){ 
    this.spec = spec; 
    } 

    public Respond validate(T t) { 
    Respond respond = new Respond(); 
    if(!spec.IsSatisfiedBy(t){ 
     respond.add(error(t)); 
    } 
    return respond; 
) 

    public abstract Error error(T t); 

    } 
Cuestiones relacionadas