2012-03-11 18 views
18

検証のために仕様パターンを使用することを考えています。難しいのは、仕様を満たさなかった理由をユーザーに伝える方法です。 Specification.IsSatisfiedBy()boolの値だけでなく、失敗の理由も返す場合はどうなりますか? Fowler & Evans仕事でDDD検証のための仕様パターンの使用

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

目的を正確に満足していなかったものを説明を提供することである部分的に満足仕様の概念があります:CheckResultがある

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

:それは次のようになります。しかし、その文書では、追加メソッドremainderUnsatisfiedByによって実装されています。これは、候補者によって実行されなかった仕様を返します。

質問:検証の目的で仕様を使用する場合、指定された仕様が満たされていないというフィードバックをユーザーに提供する方法を教えてください。私が上に提示した解決策は良いですか?

+0

まず、仕様が正しいと思いますか?つまり、各仕様は、モデルが有効か無効かのコンテキストを知っていますか?私はドメインがどのように見えるかわからないので、あまり言い表せません。 いくつかの簡単な検証では、大丈夫だと思いますが、それはDataAnnotationの検証属性が現在行っていることです。 – MikeSW

答えて

17

検証のために仕様クラスを使用することもできますが、ドメイン内で個別の概念としてそれらを保持することをお勧めします。同じ基本仕様を再利用する必要がありますが、用途や状況に応じて異なる「失敗理由」を返す必要があることがあります。詳細はthis articleを参照してください。

上記の投稿の著者は、親切にgithubのコードを共有し、コードをNCommonとして投稿しました。特に、これらの領域を確認します。

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

検証:私は同じ問題を抱えていた

+1

ニース。答えをありがとう。 – Markus

+0

運が良かったらうれしいです。 –

+2

codeinsanityの例はFluentValidationのようです:) – dariol

4

https://github.com/riteshrao/ncommon/tree/v1.2/NCommon/src/RulesValidationResultValidationErrorをに特にクラス)。仕様(コードは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); 

    } 
関連する問題