サービスは、LDAP IDストア、支払いゲートウェイ、アプリケーション管理インターフェイスなどの外部システムへのインターフェイスを作成する方法です。これは、外部システムを、操作対象の受動的な塊ではなく、おそらく内部の動作を備えた有用なサービスのプロバイダーと見なす概念的な方法です。
ファサードは、何か(サービスを含む)をまとめて、別のコンポーネントにうまく表示する方法です。ファサードは、次の場合によく使用されます。
- ライブラリまたはコンポーネントは複雑であり、アプリケーションに必要なのはそのサブセットのみです。ファサードは、簡略化されたAPIをアプリケーションに提示します
- 複数のライブラリまたはコンポーネントを使用していて、それらを統合して、統合されたAPIをアプリケーションに提示する必要があります
- 使用しているライブラリには複雑なセットアップまたは一連の依存関係があり、ファサードはそれらすべてをアプリケーションのコンテキストでラップします。
本当に紛らわしいのは、1つまたは複数のサービス上にファサードを作成できる(そして多くの場合そうする)ということです。サービスは、コンポーネントが実際にリソースにアクセスする方法であり、ファサードは、コンポーネントを簡素化するビットです(オプションの構成、接続など)。
独自のDAOを作成する場合は、おそらく必要な方法でサービスを作成するため、ファサードを作成することは、それが間違っていたことを示しています。DAOがサードパーティによって構築されており、ニーズよりも複雑な場合は、サービスをファサードできます。
現在、サービスは、複雑なデータ構造を取得するために複数のDAOへの呼び出しを実行する方法です(これについてはよくわかりませんが、これまでのところ理解しています)。
DAOはそれ自体がデザインパターンだと思います。ウィキペディアを参照してください。
DAOとサービスを対比すると、次のようになります。
- APIのレベル:
- DAO:プロパティへのきめ細かいアクセス
- サービス:サービスへのきめ細かいアクセス
- 実装がある場所:
- DAO:主にクライアント上にありますが、データベースにデータを(動作なしで)保存します
- サービス:主にサーバー上
- インターフェイスの呼び出し方法
- DAO:クライアントは同じ名前空間とJVM内のオブジェクトに直接バインドします
- サービス:クライアントは、ネットワーク、クロスVM、またはクロスネームスペース操作の単なるスタブです。
...ファサードは、単純なインターフェイスを提供することで複雑な操作を実行するために、複数のDAOに完全にアクセスでき、サービスは似たようなもののようです。
ファサードはDAOレイヤーを包み込む可能性がありますが、これが便利な方法で行われているとは思えません。ほとんどの場合、オブジェクトの個々のプロパティにアクセスしたり、オブジェクトグラフなどをトラバースしたりするために、APIが必要です。これは、まさにDAOが提供するものです。
トランザクションでも同じことが起こります。サービスがトランザクションを開始する場所であることを理解しています...
絶対に、トランザクションはデータベースと別のコンポーネントまたはシステムによって提供されるサービスであるためです
...しかし、ファサードにも配置できると同じように感じています。結局のところ、ファサードは複数のDAOを呼び出すこともあります。
また、多くの点で、トランザクションマネージャーサービスは、はるかに複雑なバックエンド実装へのファサードであり、Web、アプリケーション、データベース、およびその他のトランザクション対応コンポーネントでトランザクションを調整します。ただし、これはトランザクションサービスの実装によってすでに抽象化されています。ユーザーである私たちに関する限り、パブリックインターフェイスのみがあります。
これは、実際、これらのデザインパターンの概念的なポイントです。つまり、適切な量のAPIをユーザーに提供し、コンポーネントインターフェイスの鉄壁の背後にある実装の複雑さを抽象化します。
したがって、どちらのスタックがより理にかなっているのでしょうか
controller-facade-dao controller-service-dao
または多分
controller-facadade-daoそして時々controller-facade-service-dao??
- DAOはデータベースに対する一種のサービスですが、実際にはDAOはデザインパターンそのものです。
- 独自のDAOを作成する場合は、ファサードは必要ありません。
したがって、正解は次のとおりです。