MVCレイヤーとサービスレイヤーで検証を複製する必要がありますか?
-
01-10-2019 - |
質問
私は今少し対立していると感じています。 MVCフレームワークにはストライプを使用し、バックエンドにはspring/hibernateを使用してWebアプリケーションがあります。 MVCレイヤーには、次の検証が必要なアカウント登録方法があります。
- ユーザー名はまだ取得されていません
- 提供されたメールアドレスはまだ別のアカウントに関連付けられていません
これらの2つのケースをチェックするが、サービスレイヤーがこれらのチェックを複製する必要があるかどうか疑問に思っていたストライプ(MVCレイヤー)に検証方法がありますか?サービスレイヤーインターフェイスがWebサービスとして公開された場合、検証は良いアイデアになると思いますが、Webアプリケーションのコンテキストでのみ使用される場合は必要ですか?
編集:検証コードを複製するつもりはありません。2つの場所で検証メソッド呼び出しを複製することを意味します。
私は自分のオプションを次のように見ています:
- MVCとサービスレイヤーの両方で検証呼び出しを複製します
- MVCレイヤーでこの検証のみを実行します
- この検証をサービスレイヤーでのみ実行します。
ここでのベストプラクティスは何ですか?どのオプションに行くべきか、そしてその理由についてアドバイス/意見を探しています。
登録フォームの入力フィールド(ブランクのチェックなど)に簡単な検証チェックがあり、これらはMVC検証のみで処理されるべきだと思うことに注意してください。私はより複雑な検証についてのみ心配しています。
解決
アニー、
良い質問、私は多くの場合同じことを自問しました。これが私が(今まで)終わったことです。
最も純粋な(しかし退屈な)アプローチは、両方のレイヤーで検証ロジックを呼び出すことです。実用的なアプローチは、ウェブランド(コントローラーなど)でのみ呼び出すことです。
すべての議論を終了する答えはないと思います。それはあなたのプロジェクトのコンテキストに依存していると思います。プロジェクトサイズが控えめである場合(コードベースの人とサイズの観点から)、サービスAPIを呼び出す他のコードによって多くのコードが開発されることはないと確信しています(あなたが監督することができない範囲で)、Webレイヤーで検証を行うだけで十分かもしれません。
ただし、多くのクライアントが期待される場合は、より高いレベルのセキュリティが必要になる場合があります。ここでセキュリティを言うとき、私はそれをあなたが必要とする一貫性ガー保証のレベルと呼んでいます。そのレベルが高い場合、それを回避する方法はありません。サービス(セキュリティ用)とWebレイヤーの両方でそれを行う必要があります(主にエンドユーザーに許容可能なエクスペリエンスを提供できるように)。
したがって、ここで重要なドライバーはセキュリティと、本当に必要なものです。たくさん必要な場合は、「純粋主義者」のアプローチに行きます。あなたのアプリケーションが生と死の問題に関係するその決定を正確に行わない場合、あなたは実用的なアプローチに行きます。
他のヒント
コードを複製しないでください。使用する JSR303 BEAN検証 そのため、アプリのすべてのレイヤーで同じ検証ロジックを使用できます。
Hibernate Validator (Hibernate ORM Stuffからの別のプロジェクト)は、このインターフェイスの参照実装を提供します。使いやすい死んでいます すぐに始めましょう.
私の意見では、2種類の検証を異なる必要があります。
- フォーマットデータ検証:プレゼンテーションレイヤー(場合はMVC)で検証する必要があります。通常、クライアント側とサーバー側の両方で
- Bussinesデータ検証:サービスレイヤーで検証する必要があります
あなたの場合、あなたの検証はビジネスルールに関連しているので、私はそれらをサービスレイヤーにのみ配置します。さらに、両方のレイヤーで検証を複製すると、同じクエリを2回作成し、アプリケーションのパフォーマンスを遅くします。
理想的には、サービスレイヤーは現在のMVCレイヤー以外のクライアントで使用できるため、両方のレイヤーで検証を行います。
両方の場所で検証メカニズムを再利用します(たとえば、Bean検証)