web-dev-qa-db-ja.com

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

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

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

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

10
Michbeckable

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

1)永続性の下限

これは、接続クエリ結果セットおよびなど。通常、手元にfacade-patternを提供する一方または他方のフレームワークを使用します。クエリからの結果セット)とフレームワークがそれを見つけることができる場所(クエリと接続)。結果セットをどうするかはあなた次第です。

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

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

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

あなたの質問は一方でモデリング("オブジェクト間の関係を処理する方法"回答です:Composition/Aggregation)およびオブジェクト(およびその依存関係)にデータを入力する方法について。

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

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

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

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

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

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

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

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

4
Thomas Junk

これは、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;
    }
    ...
}
1
sfat