私の意見では、Web層とDAL(データアクセス層)の間で常にBLL(ビジネスロジック層)を使用する必要があります。
より「単純な」クエリのいくつかでは、BLLがDALを厳密に模倣することを感謝します(たとえば、すべての国をフェッチする、すべての製品タイプをフェッチするなど)が、正直なところ、あなたの例でも:
(「Atwood」という名前のすべての顧客を取得します)
ここには「ビジネスロジック」が表現されています。データレコードを名前でフィルタリングしたいという要望があります。
プロジェクトの開始からBLLを実装することにより、必要に応じて検証または追加の「ロジック」を挿入することが非常に簡単になります(プロジェクトが商用アプリケーションの場合、その必要性は最終的にはほぼ確実に発生します。プロジェクトの開始時にはありません)。次のような追加のロジックを追加します。
今年10000ドル以上を費やしたすべての顧客を取得します
また
「Atwood」という名前の顧客が1000ドルを超える商品を購入することを許可しないでください
このロジックをWeb層にクローバーしようとするのではなく、真のBLLが関与している場合に非常に簡単になります。
上記の種類のクエリでは、この機能を実装するために特別に定義された関係で結合する必要がある複数のエンティティとデータベーステーブルについてほぼ確実に話していることに注意してください。DALを直接操作してこれを達成しようとすると、複数のエンティティとクラスを処理するため、面倒になります。ここでのBLLは、Web層コードを大幅に簡素化します。これは、BLLが、大幅に簡素化されたインターフェイスの背後にあるエンティティの関係をカプセル化するためです。
この「関心の分離」は、ユーザーインターフェイスを変更する必要が生じた場合に、ますます重要になります。
現在、少なくとも2つの別々の機会に、Webサイトのユーザーインターフェイスを備えた商用Webアプリケーションに取り組んでおり、最終的には(ソフトウェア製品内でのより高度な統合を求めるクライアントから生じるビジネスニーズのために)Webサービスインターフェイスの作成を求められました。 Webサイトとまったく同じ機能を提供します。
Web層にビジネスロジックを組み込んだ場合、Webサービスを実装するときに、そのロジックを複製して書き直す必要がありました。つまり、すべてのビジネスロジックがBLLクラス内にカプセル化されていることを確認しました。つまり、一連のWebサービスインターフェイスメソッド呼び出しを設計し、これらをBLLクラスのメソッド呼び出しに対してプラグインするだけで済みました(実際に使用したのはWebサービスAPIを簡素化するための場所のファサードデザインパターン)。
全体として、DALとWeb層の間にBLLレイヤーを含めない理由は考えられません。
最も簡単なのは、BLLがDALを厳密に「模倣」する場合です。そうです、コードと機能が重複しているように見えますが、もう少し入力するだけで、実装も比較的簡単になります。
それがより複雑な場合(重要なビジネスロジックが最初から存在する場合など)、関心の分離は繰り返しを減らすのに役立ち(DRYの原則)、同時に将来の継続的なメンテナンスを大幅に簡素化します。
もちろん、これはあなたがこれらすべてを「手作業で」行っていることを前提としています。必要に応じて、多数のORMを利用することで、DAL / BLL/UIレイヤーを大幅に簡素化できます。(つまり、LINQ-to-SQL /エンティティ、SubSonic、NHibernateなど)