9

新しい ASP.NET MVC Web アプリケーションの作業を開始するたびに、DataAnnotations検証を使用するかどうかがわかりません。それについての何かが間違っていると感じます。

たとえば、のアクションからUserService渡される があるとします。ユーザーが常に名前を指定できるようにするために、モデルのプロパティに属性を設定しました。名前がない限り、モデル バインダーが私に.CreateUserModelCreateAccountControllerName[Required]CreateUserModel

私の問題はUserService、システムの再利用可能なコンポーネントになるためには、上のレイヤーが有効なデータを提供しているという事実に依存できず、このデータも確実に検証する必要があることです。を完全に再利用する Web サービスを作成する必要があると考えると、この必要性がさらに強調されますUserService(モデル バインダーですべてのデータ アノテーションの検証を行う必要はありません)。

私の質問は次のとおりです。この状況のベストプラクティスは何ですか? データ注釈を使用して検証し、その検証をサービスで繰り返しますか? サービスでのみ検証し、例外をスローしますか? 両方のミックス?

私の質問が主観的すぎないことを願っています。私は主に、検証をデータ注釈に移動することが最終的に私を噛むことになるかどうかについてコンセンサスを確立しようとしています.

4

3 に答える 3

7

手動検証(x == yの場合)とデータ注釈の組み合わせを使用して、サービスレイヤーですべての検証を実行します。

サービスレイヤーでデータアノテーションを使用するには、メソッドを使用してValidatorクラスを手動で使用する必要がありますTryValidateObject()この良い例はここで見ることができます。

次に、検証エラーをサービスレイヤーからコントローラーに渡し、コントローラーに各エラーをモデル状態エラーリストに追加させる必要があります。

于 2010-09-22T20:25:13.060 に答える
1

個人的には、ロジックが 1 つの場所で定義されている限り、物事が 2 回検証されることを気にしません。これは明らかにあなたの状況に当てはまります。私は MVC について多くを語れるほどの経験はありませんが、サービス レイヤーから例外をスローしても、検証時に MVC が提供できるほど優れたユーザー エクスペリエンス (UX) は得られないことは想像できます (それは可能です)。インスタンスは、無効なテキスト ボックスの横にエラー メッセージを表示します (サービス層から例外をスローする場合、これを行うのははるかに困難です)。UX が同じ場合は、サービスでのみ検証を行い、それ以外の場合は両方のレイヤーで検証を行います。

于 2010-09-20T18:43:00.923 に答える
1

そうです、コントローラーの検証を無効にして、サービスレイヤーで検証する必要があります。必要に応じて、引き続き DataAnnotations を使用できます。サービス層は検証メッセージで例外をスローでき、コントローラーはその例外をキャッチして、検証メッセージを ModelState に追加できます。コントローラーの OnException メソッドで検証例外を処理することにより、アクションごとにそれを回避できます。

于 2010-09-20T03:29:46.550 に答える