DDD使用规范模式进行验证

时间:2012-03-11 13:05:12

标签: domain-driven-design

我正在考虑使用规范模式进行验证。困难的是如何告诉用户为什么某些规范不满意。如果Specification.IsSatisfiedBy()不仅会返回bool值,还会返回失败原因,该怎么办?它看起来像这样:

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

其中CheckResult是:

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

Fowler & Evans工作中,有一个部分满足规范的概念,其目的是提供解释究竟不满意的内容。但是在该文档中,它是作为附加方法 remainderUnsatisfiedBy 实现的,它返回 Candidate 未完成的规范。

所以问题是:当使用规范进行验证时,如何向用户提供不满足给定规范的反馈?我上面介绍的解决方案是否很好?

2 个答案:

答案 0 :(得分:18)

虽然您可以使用规范类进行验证,但我建议您将它们作为域中的单独概念。您可能会发现需要重复使用相同的基础规范,但需要根据目的和上下文返回不同的“失败原因”。有关详细信息,请参阅this article

上面引用的帖子的作者也向github分享了代码,并将代码发布为NCommon。特别回顾这些领域:

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

验证https://github.com/riteshrao/ncommon/tree/v1.2/NCommon/src/Rules(尤其是 ValidationResult ValidationError 的类)

答案 1 :(得分:5)

我遇到了同样的问题。我为规范创建了验证装饰器(代码是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);

  }