2011-08-10 10 views
3

ViewModelとビジネス/ドメインオブジェクトの両方で検証規則を繰り返す必要を避けるにはどうすればよいですか?コードを繰り返さずにビジネスとビューの検証を実装する方法は?

たとえば、私はViewModelでDataAnnotation属性を使用できます。これにより、MVC Webアプリケーションでクライアント側とサーバー側の検証が行われます。しかし、このViewModelは一般にビジネス/ドメインオブジェクトにマップされ、サービスプリフォームにいくつかのビジネスロジックが与えられます。これは、しばしば同じルールまたはsimularルールで検証が再度行われなければならないことを意味します。これはとにかくラウンドですか?

答えて

6

私は、あなたが説明していることは、正常で許容できるものだと思います。あなたのUIとデータの注釈は、入力されたデータの検証の問題をすぐにユーザーに示すことができるフレンドリーなUIの検証と考えてください。

私はちょうど値を検証しますが、ビジネス・ルール強制ではない、完全な検証であるためにあなたのビジネス/ドメインオブジェクトの検証を検討する(すなわち - カートにアイテムを追加 - >お手持ちのアイテムですか?)

そこデータベースによってしばしば強制されるバックエンドの検証(つまり、列内のNULLの許可)です。あなたのデータベースでは、あなたが言及した2つの場所以上で実際に検証を実行するすべてのフィールドでnullを許可しない限り、これは良いことだと思います。

私は、あなたのビジネス/ドメインオブジェクトがすべての検証を実施し、クライアント側とバックエンドの検証が単純に最も基本的なものにすることを望んでいると思います。

希望に役立ちます。

+1

すばらしい説明。私が行ったルールは、すべての論理境界またはレイヤー全体で再検証することです。これは、UIレイヤ、ビジネスレイヤ、データベースレイヤ、サービスレイヤなどで検証することを意味します。 –

0

2つのオブジェクトを検証し、コードの重複を避けたい場合は、あなたが聞きたくない答えがあると思います。

私が考えることができる唯一の例外は、返されたビューモデル(未検証)を取得し、データベースアクションを実行する場合と同じようにモデルを作成し、そこで検証チェックを行うことです。エラーがある場合は、それらをModelStateディクショナリに戻して、ブラウザにエラーを返します。このアプローチには、クライアント側の統合を失うという大きな副作用があります。つまり、サーバー側に多くのAJAX呼び出しが含まれています。

個人的には、私は敗北を受け入れ、重複して作業し、コードの多くを再利用できるようにすることを承諾します(たとえば、両方のビューに配置できるデータ注釈属性モデルやビジネスモデル

  • ビューモデル内のチェックは提供情報が正しい例であることを確認する必要があります。。

    • その空でない
    • その有効な電子メールアドレス
    • 電子メールアドレスはまだ使用されていません
    • 入力された値は「電子メールの確認」ボックスの値と一致しました。あなたのビジネスモデル内
  • チェックがデータが正しいことを確認してください。例えば

    • これは空ではありません。
    • 長さが最大長よりも小さい。

あなたは、データが代替のインターフェイス(またはあなたの物忘れ)によってinconcistentチェックによって汚染を受けることが懸念している場合は、ビジネス・ロジックと、その後、ビジネスロジックにメソッドの一部を複製したり、モデルメタデータにも反映されます。

関連する問題