リポジトリパターンとDAO管理エンティティ


10

DAO、DAL、ドメイン駆動設計などのコンセプトは初めてです。最後に、パーシスタンスレイヤー(mysqlデータベース)を、Webアプリケーションのビジネスオブジェクトおよびロジックから切り離したいと考えています。DAOのコンセプトは気に入りましたが、他のエンティティが関連付けられているデータベースからビジネスオブジェクトを作成しようとすると、DAOの実装に行き詰まりました(dbテーブルの外部キーで表されます)。

  1. これらの参照(集計)はDAOパターンを使用してどのように処理されますか?すべてのオンラインDAOの例は単純で、(他のエンティティや値オブジェクトを参照せずに)値オブジェクトのようなビジネスオブジェクトのみの作成を示しています。依存性注入を使用して行われますか?そうであれば、依存関係はどこに作成されますか?
  2. さらに読むことで、DDDからのリポジトリパターンは、バックグラウンドでDAOを使用し、オブジェクトの集約を処理する可能性を与えると思います。私が理解しているように、それはいわゆるルート(すべての参照がロードされたエンティティまたはレイジーロードされたエンティティ)を外界に提供するだけです。DAOの使用時にリポジトリは推奨されますか、それともDAO自体がビジネスオブジェクトに対する永続性の無知を維持することによってこの機能を提供できますか?

私はORMツールを使用しておらず、これらの基本的なパターンを直接探求したくはありません。



申し訳ありませんが、この質問のほうが適切だと思いました。stackoverflowで削除します。
Michbeckable、2015年

どの言語フレームワークを使用していますか?具体的な例が必要な場合は、件名に関するMartin Fawlerのものも参照する必要があります。
AK_ 2015


エンタープライズアーキテクチャのパターンには、データアクセスパターンに関するすばらしいセクションがあります。私が正しく覚えているとすれば、ファウラーのテーブルデータゲートウェイはDAOに類似しているため、彼が本で説明しているパターンの多くはORMライブラリに実装されています。
Mike Partridge 2015年

回答:


4

対処すべき2つの懸念事項があります-互いに直交しています。

1)永続性の下限

ここで、接続クエリ結果セットなどを処理する必要があります。通常、手元にファサードパターンを提供する一方または他方のフレームワークを使用します。これにより、ダーティなものを抽象化して、何を知りたいか(クエリからの結果セット)とフレームワークがそれを見つけることができる場所(クエリからの結果セット)のみを伝えます。クエリと接続)。結果セットをどうするかはあなた次第です。

パラダイムがOOPの場合、追加のステップが必要です。結果セットをオブジェクトにアセンブルします。手動で行うか、object-relational-mapperで処理を実行します。

2)アプリケーション内の抽象化 この低レベルのレイヤーの上に、アプリケーションが扱う抽象化があります。ありDataAccessObject(DAO)-layerまたはリポジトリ -layer。どちらもアプリケーションで動作するオブジェクトを生成します。

どちらを使用しても、質問の回答には影響しません。

あなたの質問は、一方でモデリング(»オブジェクト間の関係を処理する方法«回答:合成 / 集計)と、オブジェクト(およびその依存関係)にデータを入力する方法です。

依存性注入を使用して行われますか?そうであれば、依存関係はどこに作成されますか?

これが方法です。2つの方法があります。

1)DIを明示し、コンストラクターを定義します。オブジェクトを作成するとき、最初にすべての依存関係を作成し、コンストラクターまたはセッター注入を介してそれらを注入することができます

2)あなたはあなたのために魔法をかけるフレームワークを使います。多くの場合、リフレクションが含まれます。つまり、一部の言語では、オブジェクトをその場で調べて操作する可能性があります。インジェクションは、フレームワークによってユーザーに対して透過的に行われます。

これは、DAO /リポジトリパターンから独立しています。

私はORMツールを使用しておらず、これらの基本的なパターンを直接探求したくはありません。

これは高貴なアプローチですが、すべての場合に生産的ではありません。ほとんどの場合、あなたは仕事をやりたいと思っています。教育目的のために、あなたはその道を下ることができます。しかし、私はそれをお勧めしません。

柔軟なORMフレームワークを探してください。これにより、必要に応じて、何らかの方法で強制することなく支援を提供できます。すべての場合にootBで生成されたクエリが有効であるとは限りません。優れたフレームワークでは、必要なときにSQLを使用して、組み立て部分のみを処理できます。


1

これは、ORM(オブジェクトリレーショナルマッピング)が役に立ちます。このタイプのプログラミング手法を提供する多くのプログラミング言語用のライブラリがあります。たとえばJavaにはHibernateがあります。HibernateはJavaアノテーションで動作します。公式ドキュメントの多対1の関係の簡単な例を次に示します

@Entity
public class Flight implements Serializable {
    @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name="COMP_ID")
    public Company getCompany() {
        return company;
    }
    ...
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.