新しい ASP.NET MVC 2 検証機能を使用すると、ドメイン モデル オブジェクトのプロパティを、DataAnnotations
有効な値の条件を説明する属性で修飾できます。はこれを認識しており、コントローラー アクションが呼び出される前に、それに応じDefaultModelBinder
て入力します。ModelState.IsValid
検証ルールはドメイン モデル内で定義されるため、これはモデル レベルの検証と見なされます。スコット・ガスリーは次のように書いています。
Person オブジェクト内にルールを実装する利点は、Person オブジェクトを使用するアプリケーション内の任意のシナリオを介して検証が確実に実施されることです [...]
厳密に言えば、すべてのアクション メソッドがプロパティをチェックし、その値に応じて異なる動作をする必要があるため、私の意見では、ルールは実際には強制されていません。ModelState.IsValid
また、ルールはモデルで定義されますが、すべてのモデル バインダーが存在する場所であるため、プレゼンテーション レイヤーに適用されます。しかし、これは私が言葉の選択にうるさいだけだと思います(または私が単に間違っているだけです)。
しかし、ドメイン モデル レベルで検証ルールを適用する場合はどうでしょうか。Steven Sanderson は、xVal 検証フレームワークに関する投稿でこのアプローチを使用しており、次のように書いています。
現在、モデル層は、すべての検証およびビジネス ルールを満たさない予約を拒否することで、独自の有効性を強化しています。
彼の例では、コードを使用して無効な予約を行おうとすると、「予約マネージャー」(モデル内に存在する) が特別なビジネス ルールの例外をスローします。したがって、事前に予約の有効性を確認したかどうかに関係なく、消費コードが無効な予約を配置することは不可能ModelState.IsValid
です (またはその他のカスタム構造を介して)。
だから私の質問は:
モデルレベルで定義された検証ルールがあると仮定すると、モデル内でも適用する必要がありますか?
(私はドメイン駆動設計の概念にまったく慣れていないので、正しい用語を正確に使用していない場合はご容赦ください。)