tutorial quickly que example evans eric driven domain ddd domain-driven-design

domain driven design - quickly - DDD usando el patrón de especificación para la validación



que es ddd (2)

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é no se cumplió alguna Especificación. ¿Qué sucede si Specification.IsSatisfiedBy() no solo devolverá un valor bool , sino también la razón del error? Se vería algo como esto:

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

donde CheckResult es:

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

En el trabajo de Fowler y Evans hay un concepto de Especificación parcialmente satisfecha cuyo propósito es proporcionar una explicación de lo que no se satisfizo exactamente. Sin embargo, en ese documento, se implementa como un método adicional resto no satisfecho por el cual devuelve la Especificación que no fue realizada por el Candidato .

Entonces, la pregunta es: cuando se utiliza la Especificación para fines de validación, ¿cómo proporcionar al usuario un comentario de que una Especificación determinada no se cumplió? ¿Es buena la solución que he presentado anteriormente?


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 que deba devolver diferentes "razones de error" según el propósito y el contexto. Vea este artículo para más detalles.

El autor de la publicación mencionada anteriormente también ha compartido amablemente el código con github y ha publicado el código como NCommon. Revise 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 )


Yo tuve el mismo problema. Creo un 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); }