我正在考虑使用规范模式进行验证。困难的是如何告诉用户为什么某些规范不满意。如果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 未完成的规范。
所以问题是:当使用规范进行验证时,如何向用户提供不满足给定规范的反馈?我上面介绍的解决方案是否很好?
答案 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);
}