2009-09-25 8 views
11

のは、私はそうのようなPOCOを持っているとしましょう: POCOに検証ロジックを入れるべきですか?

public class Name 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

は、姓と名がnullにすることはできません。

public List<Error> Validate() 
{ 
    var errors = new List<Error>(); 

    if (String.IsNullOrEmpty(FirstName)) 
     errors.Add(new Error("FirstName", "You must fill out first name.")); 
    if (String.IsNullOrEmpty(LastName)) 
     errors.Add(new Error("LastName", "You must fill out last name.")); 
} 

ErrorNameValueDictionaryが含まれています構造体です:私はこのような方法で追加する必要があります。これは良いことですか?誰かが最初にValidate()を実行せずにこのPOCOを保存しようとするリポジトリに問題が発生する可能性があります。

答えて

2

xValのようなアスペクト指向の検証フレームワークの使用を検討してください。

検証ルールをコードに直接組み込む必要はなく、プロパティの属性として追加して依存関係をオフロードできます。動作します物事の簡単な方法がある

public class Name 
{ 
    [Required] 
    public string FirstName { get; set; } 
    [Required] 
    public string LastName { get; set; } 
} 

がより直接的に自分のPOCOに検証ルールを追加し、あなたの質問に答えるために、維持する重々しい得ることができ、あなたはよ:あなたのクラスは、このようになります。すべてのオブジェクトにわたってValidateインターフェイスを強制する必要があります。これは自分の頭痛です。アスペクト指向のソリューションは、これらの問題や他の多くの問題に対処する非常にエレガントなソリューションです。

+1

私は前にxValを見てきましたが、私はドキュメンテーションとサンプルの明確な欠如を発見しました。おそらく私はPOCOを使用しているので、もう一度見ていきます。 –

+0

これで、ファイルパス文字列がハードドライブ上の物理ファイルを指し示していることを検証するなど、より高度な検証が必要な場合をどう扱うことになりますか? –

+0

xValを使用すると、カスタム検証属性を作成できます。ここに例のページがあります:http://blog.codeville.net/2009/02/27/xval-08-beta-now-released/ – womp

3

私はしません。私のPOCOは、そのコンテキストに基づいて異なる検証をする傾向があります。 「私のPersonオブジェクトはこのアプリケーションにアドレスを持っていなければなりませんが、この他のアプリケーションには電話番号が必要です。」...目を保って柔軟にしたいものです。

私は通常、同じドメインを再利用しますが、同じアプリケーションの異なる領域であってもコンテキストに基づいて異なる動作と検証を割り当てているため、貧血ドメインモデルの主張者です。

新しい機能を実装するとき、私は通常、自分のクラスを見て、自分自身にこの質問をします:これはこのクラスの責任のようですか、それとも別の責任セットを持つクラスに適していますか?私たちはこれを "Feature Envy"のチェックと呼び、それがクラスが何であるかを分かりやすくするのに効果的です。

+0

2番目の段落に非常に同意します。これは、ルールエンジンが普及した正確な理由です。 – womp

+3

貧血領域モデルは役に立たない。あなたはどこにでも同じビジネスロジックを記録することになります。マーティン・ファウラー(Martin Fowler)によれば、実際には反パターンである。貧血モデルはDTOだけではありません。 – Andy

+1

コメントは古いものですが、[Andyが参照しているもの](http://martinfowler.com/bliki/AnemicDomainModel.html)へのリンクを追加すると便利だと思いました。 – Derek

0

私はモデルにバリデーションを入れても間違いないと感じます。これは、モデルが有効かどうかを尋ねることができ、1つのDTOを別のものにマッピングし続けることなく、ビューでの検証やモデルの編集をやり直す(または悪いのは、そこに置くだけです)。

サンプルのルールは単純ですが、複雑なルールを書く必要があることがよくあります。おそらく、Csla.Netフレームワークをチェックアウトしてください。