いくつかのビジネスオブジェクト(例:個人、ハウスなど)とそれらの間で、ユーザー入力(テキストボックスから入力される)を検証する必要があります。それはどちらかに行くだろう:
- 各ビジネス・オブジェクト
- のWinFormsは、別々の(?静的)クラス
- を分離コード。
おかげ
いくつかのビジネスオブジェクト(例:個人、ハウスなど)とそれらの間で、ユーザー入力(テキストボックスから入力される)を検証する必要があります。それはどちらかに行くだろう:
おかげ
各ビジネス・オブジェクト。私は古典的に、それぞれがオブジェクトのすべての検証エラーを吐き出すIValidatorインターフェイスを実装するようにしました。
このようなシナリオで私が推奨する非常に広く使用されているアプローチは、ビューに表示されるすべてのデータを集約し、このデータに対してどのタイプの検証を実行する必要がありますか。
このアプローチには、いくつかの利点があります:
実際に検証を行うコードは通常、別の検証クラスの内部にあります。あなたのビューモデルは、各データにどのように検証を適用するかを指示するだけです。
ビジネスオブジェクト。その理由は、検証ルールをテスト可能にしたいということです。ルールが重要な場合は、テストでそれらをカバーしたいと思うでしょう - そうでない場合は、最初にそれらを実装しないでください。これを極限まで引き上げると、コードビハインドが非常に薄く、ロジックがほとんどないコードが得られます。これは欲しいものです。
ここではいくつかの良い習慣:代わりに一度http://colinjack.blogspot.com/2008/03/domain-model-validation.html
は、ドメインモデルでは、UIは、モデルから検証状態/出力を反映することができるはずです。
これに対して、ViewModelの目的はモデルにアタッチできるように、ビューのアダプタにすることです。つまり、WinFormsでは、通常、ViewModelを持っていません。 ViewModelは、その名前にもかかわらず、* view *の一部であり、モデルではありません。したがって、私は検証ロジックをそこに置くことを避けるだろう。 – vidstige
@vidstige:あなたの答えでは、モデル内に検証コードを入れることをお勧めします。そのような制限がない人のための他のフォームがある場合、あなたはどのように大人でなければならない人のためのフォーム(誕生日に基づいて)を扱うでしょうか?あなたはクラス「大人:人」を持つことができますが、ある時点でビジネス要件が変わった場合は、「大人」のこの特定の使用*を特に探して「人」に戻す必要があります。型定義 - すべてではありません。綺麗ではない。 – Jon
興味深い質問!これは、実際にはモデルで簡単に処理できます。おそらくこのコメントフィールドの範囲外ですが、たとえば、このポリシーをViewModelに注入できます。これにより、1つのフォームがあり、ViewModelには* 2つのモデルがあるため、1つのViewModelがあります。 – vidstige