web-dev-qa-db-ja.com

リポジトリパターンとアクティブレコードパターンは互換性がありますか?

現在、Active Recordパターンを実装するモデルを定義したWebアプリケーションを開発しています。各モデルは、Entityプロパティを指定し、他のクラスに簡単に注入できるようにするインターフェイスによっても定義されます。これは、単体テストに特に役立ちます。データベースの実装を抽象化するために、Repositoryパターンで各モデルを実装することを楽しみにしています。

例:記事:

ArticleInterface
- title
- content

ArticleRepositoryInterface
- getArticle(title)
- saveArticle(ArticleInterface)

ArticleRepository implements ArticleRepositoryInterface
- constructor(ArticleInterface)
- ArticleInterface getArticle(title)
- saveArticle(ArticleInterface)

Article implements ArticleInterface extends ActiveRecordModel

どちらのパターンも今日のWeb開発フレームワークでは非常に人気がありますが、それらを統合する方法はわかりません。 Active Recordパターンの定義は、データベーステーブルの行をラップし、データベースアクセスをカプセル化し、各オブジェクトプロパティをデータベーステーブルにマッピングします。

  • 各モデルリポジトリをARを実装するモデルとどのように統合する必要がありますか?

  • ARを実装するモデルを使用し、すべてのデータベースメソッドを継承し、それをすべてのARデータベースメソッドをラップするリポジトリに注入する代替手段はありますか?

  • このシナリオのベストプラクティスは何ですか?

それがこの質問にコンテキストを追加する場合、私は Laravel および Eloquent を使用しています。

8
marcanuy

リポジトリパターン:

ドメインオブジェクトにアクセスするためのコレクションのようなインターフェイスを使用して、ドメインとデータマッピングレイヤーの間を仲介します。

選択したデータマッピングレイヤーはアクティブレコードです。エルゴ、リポジトリは、アクティブレコードパターンとビジネスドメインの間の抽象化の追加レイヤーを提供するソフトウェアパターンです。

各モデルリポジトリを、ARを実装するモデルとどのように統合する必要がありますか?

コレクションのようなインターフェイスをビジネスドメインに返すメソッドを提供し、Active Recordを使用してデータベースから必要な結果を取得します。

ARを実装するモデルを使用し、すべてのデータベースメソッドを継承し、それをすべてのARデータベースメソッドをラップするリポジトリに注入する代替手段はありますか?

Active Recordの代わりに、Table Data Gateway、Row Data Gateway、Data Mapperなど、他の方法でデータベースにアクセスできます。

このシナリオのベストプラクティスは何ですか?

パフォーマンスと保守性の観点から、ソフトウェアの機能要件と非機能要件を最もよく満たすプラクティス。

6
Robert Harvey

アクティブレコードとリポジトリパターンの大きな違いは、私の意見では、エンティティインスタンスと基礎となるストレージ間のリンクの所有者です。

  • アクティブレコードでは、エンティティインスタンスはそれ自体を永続化する方法と場所を知っています(これは私の頭の中で「アクティブ」が何を意味するかです)。これが、user.save()を呼び出すだけで永続化する理由です。
  • リポジトリパターンでは、エンティティはおおざっぱなPOJOであり、そのライフサイクルを管理するリポジトリです。エンティティの新しいインスタンスを作成した場合、それは魔法のように永続化されないため、リポジトリに永続化するように指示する必要があります。

Active Recordは1つのバッキングストレージに接続されているため、シンプルですが柔軟性が低くなります。

エンティティのライフサイクルを誰が管理するかに関しては、どちらか一方を選択する必要があります。

ただし、それ以外は、ハイブリッドのようなものを作成できます。エンティティはそれ自体を管理します(つまり、.save()や.delete()などのアクティブレコード->メソッド)。 ())。

4
qbd