Repository
Repository Pattern
永続化機構の詳細な実装や利用方法の違いなどを隠蔽することが目的
Aggregate単位で、永続化層との出し入れを行う
プログラムの外部との境界
直接的なアクセスを必要とするAggregate Rootに対してのみRepositoryを提供する
あるAggregateのcollectionがメモリ上にあると錯覚させるように、設計されるべき
どのデータストアに対して検索や更新しているかを意識させない
例えば、データストアが、MySQLなのか、Redisなのかなどは利用者は意識しない
引数で、条件を指定し、
返り値は、Aggregateか、AggregateのCollectionになる
OOPの場合、instantiateされたAggregateになる
返り値がAggregateなので、仮に永続化機構が訳のわからんデータ構造になっていても、内側が汚染されることはない
この図がわかりやすい
https://gyazo.com/e9096f54ffc710b62c5c4b7225bf8e69 https://codezine.jp/article/detail/11048
repositoryの返り値はAggregatemrsekut.icon
Repositoryのmethods
どこまで汎用にするか?で大きく方針が変わる
/kawasima/リポジトリクラスのメソッド設計
最も具体的なものが、SQLを決め打ちするmethod
これでも、どこを変数に取るか?で再利用性は変わる
再利用性を上げればいいって話でもない
ORM
参考
実践DDD本 第12章「リポジトリ」~集約の永続化管理を担当~
/mrsekut-book-4798121967/187 (リポジトリ (REPOSITORIES))~
初見では異常にわかりづらい
理解してたら読める
やはりお前たちのRepositoryは間違っている - Qiita
アンチパターンなど
#WIP
/miyamonz/repositoryパターンに対する批判
/miyamonz/repositoryとのやりとりを抽象するのではなく、repositoryとの間のデータを抽象しよう
https://codezine.jp/article/detail/11048#:~:text=リポジトリの設計%20~「コレクション指向」と「永続指向」~
Collectoin指向
RDB, インメモリ
add()という名前のmethod
永続指向
transactionは、repositoryが管理しない
repositoryはメモリ上のobjectに対して、追加や挿入をするだけ
commitするタイミングは、利用者に委ねる
/mrsekut-book-4798121967/196
Repositoryは、
objectを永続化層に格納する
objectを永続化層から取ってくる
この時に、Factorをツアkったりする
/mrsekut-book-4798121967/198
でも、Entityで計算する必要があるものがあると
「RepositoryがAggregateを返す」って無理じゃない?
適当な初期値を返して、その後にEntityで計算する感じになるの?
あるいは、Repositoryの中でEntityの関数を呼べばいいmrsekut.icon
https://zenn.dev/karibash/articles/4cc74e4705dc9c
テストで使用するために、ダミーの実装で置き換えるのが容易になる(インメモリコレクションを使用するのが一般的)。
データの永続化の抽象を担う
どこに保存するか?を気にせずに、保存する処理を書く感じ
保存先はLocalStrageかも知れないし、DBかも知れないし
イメージとしてはinterfaceにはsaveがある感じ
code:ts
interface Repository {
save: (user: User) => void;
...
}
この実装時にLocalStrageやDBにsaveする具体的なロジックを書く
API通信はここが担うのか #??
https://speakerdeck.com/sonatard/ideal-and-reality-of-abstraction-by-repository
https://qiita.com/kondei/items/41c28674c1bfd4156186#gateway
Gatewaysが知っていることの例
なんのDBを使っているのか
Repositoryから別のRepositoryを呼ぶのは良いか悪いか
Repositoryのtest
実装例
実装クリーンアーキテクチャ - Qiita
サーバー側の例