典型的な Web 3 層アプリケーションについて、次の設計 (および理想的なアーキテクチャの提案) にはどのような欠陥がありますか?
私の現在の青写真のアプローチは大まかにこれです(Java、Spring、Hibernate、JSPを想定)
コントローラ
ステートレスで、(遅延初期化例外を回避するために) 読み取り専用トランザクションでラップされる可能性があり、サービスのみを介して永続ストレージからエンティティを取得し、それらをモデルとしてビューに渡します。それらに対してビジネス ロジックを実行し (BL はサービス レイヤーにのみ存在する必要がありますか?)、必要に応じて永続化のためにサービス レイヤーに戻します。
長所: 読み取り専用のトランザクション ラッピングの場合 - 1 つの接続のみ、同じ永続エンティティに対する冗長なヒットがない、クエリ キャッシュをより適切に利用する、サービス レイヤーが要求パラメーターを「認識」してはならない、または必要な init グラフ スパンを使用しない、lazy init 例外を回避する。
短所: 読み取り専用のトランザクション アプローチはリスクが高い可能性があります。コントローラーは理想的なビジネス ロジックのぶら下がり場所ではありません... JUnit を実行するのは非常に困難です (入力は要求です...)
意見
非トランザクション (非遅延コレクション/メンバーへのアクセスは、遅延初期化例外になります)
長所:
ビューの作成者は、単なるドット表記によってアプリケーションのパフォーマンスに影響を与えるべきではありません (たとえば、大規模なコレクションの遅延初期化による N+1 選択の原因)。
また、切断されたクライアント (Flex またはその他のリッチ クライアント) では、リモートでの遅延初期化はサポートされていないか、賢明なことではありません。
短所: コントローラー / サービス / DAO は、ビューのエンティティの適切なグラフを慎重に準備する必要があり、オーバーシュート (パフォーマンス) / アンダーシュート (遅延初期化例外) になる可能性があります。エンティティ グラフを初期化できる順列の数にはデカルト積があるため、無数のサーバー側メソッドが混乱を引き起こす可能性があります。
モデル
永続オブジェクトをそのまま (データ転送オブジェクトなし) 使用すると、状態がセッションに保存されます。
長所: POJO を書き直す必要がない、既存のエンティティを再利用する、セッション状態は非表示フィールドの状態処理よりも安全です。
短所: 切断されたフレームワークには不向きです。切断された古いオブジェクトを保存するリスク、ロックの問題のリスク、他のデータの上書きのリスク、楽観的ロックが必要な場合があります。
サービス
トランザクショナルで、リクエスト スコープがわからないため、実際の永続ストレージ アクセスのために DAO レイヤーを呼び出します。これは、古典的に BL があるべき場所ですが、BL がコントローラー側に何度も漏れているようです。
ダオ
アトミック永続ストレージ ファサード、BL を無視、または任意のコンテキストを含む
最後に、質問:
上記のアーキテクチャで何を修正しますか?
(私のように)それは非常に一般的なアプローチだと思いますか(ビュー内のオープンセッションなど、いくつかの小さな違いがあります)?それとも、あなたがそれを見るのは初めてで、私は何かひどく間違った (または正しい) ことをしているのですか?
アプリケーションでどのように解決しますか? モデルとビューにもエンティティ POJO を使用していますか? それとも、より単純な UI Bean に接続しますか (すべて完全に初期化され、安全です)。
これは主観的な質問かもしれませんが、1 つ、2 つ、または 3 つの最大の一般的な「宗教」に集中する明確なベスト プラクティスの設計パターンがあると確信しています。