質問

コンテキスト:
私は、エンティティブックを持っています。この本は、一つ以上の説明を持つことができます。説明は、値オブジェクトです。

問題:
説明は、別の説明より具体的にすることができます。説明は本の内容が含まれており、カバーがどのように見えるか、それが唯一のカバーがどのように見えるかを説明し説明より具体的である。場合など私はこれをモデル化する方法と、リポジトリがそれを保存持っているのか分かりません。これらの関係を知っている書籍のも、本記述の責任ではありません。いくつかの他のオブジェクトは、これを処理し、その後の関係を保存するためのリポジトリを求めることができます。しかしBookRepository.addMoreSpecificDescription(説明、MoreSpecificDescription)が保存するリポジトリのは難しいようです。

はどのようなものがDDDに処理されますか。

役に立ちましたか?

解決

他の2つの答えが一方向(+1 BTW)です。私はここに、元の質問へのあなたの編集後で来て、私の2セントですしています...

私は(となる)他のエンティティ間で共有可能な2つの以上のプロパティを持つオブジェクトとして値オブジェクトを定義します。彼らは、単一の集約ルート内で共有することができ、それはあまりにも大丈夫です。彼らは(とされる)に共有できること。

ただ、実際

あなたの例を使用するには、バリューオブジェクトとして「説明」を定義します。これは、複数のプロパティを持つ「説明」は、複数のブック間で共有することができることを私に伝えます。我々はすべてそれぞれの本が執筆したり本を出版したのマスターによって書かれたユニークな記述を持って知っているように、現実世界では、それは意味がありません。ヘヘ。だから、私は説明が本当に値オブジェクトではなく、自身が(あなたが単一の集約ルートのエンティティ内に複数のエンティティを持つことができます)あなたのブック集約ルートエンティティboundery内の追加エンティティオブジェクトであることを主張するだろう。など、新しいリビジョンを再リリースしても書籍が、そのわずかな変化を説明わずかに異なる記述を持っています。

私は、あなたの質問に答えると信じて - (例えばBook.GetDescriptions()...)説明エンティティオブジェクトを作成し、あなたのメインブックエンティティの集約ルートの後ろにそれらを保護します。この記事を読んだ他の人のために、私はリポジトリで値オブジェクトを処理する方法この回答アドレス、残りの...

リポジトリに値オブジェクトを格納し、それらを取得するために、我々は、私はDDDのアプローチに「データベース・最初の」モデリング手法から切り替わっ行ったとき、私は自分自身と格闘同じ領土に侵入し始めます。私自身は、DBに値オブジェクトを格納し、アイデンティティなしでそれを取得する方法について、この1とwreslted。私は私が何をしていたか後ずさりし、実現するまで...

ないデータストア -

ドメイン駆動設計では、あなたのドメインで値オブジェクトをモデル化しています。これは、キーフレーズです。それはあなたが好きしかし、あなたがそれらを保存することができ、データストア内の独立したオブジェクトとして格納される値オブジェクトを設計されていないことを意味します!

のは住所であること()は、値オブジェクトの共通DDDの例を見てみましょう。 DDDは、バリューオブジェクトの定義は、プロパティは、オブジェクトの一意性を作成するためにまとめる誰の対象であるとして、メーリングリストのアドレスは、完璧な値オブジェクトの例であることを示します。プロパティが変更された場合、それは別の値オブジェクトになります。そして、そのプロパティの値が同じオブジェクト9tehの合計)は、他のエンティティ間で共有することができます。

メーリングアドレス位置、地球上の特定の位置の長い/緯度です。複数の人が住所に住んでいる、と誰かが同じメーリングリストのアドレスを占有するために、新しい人々を動かしたときに、今と同じ値オブジェクトを使用します。

することができます

だから、私はそれにアドレス情報を持っているMailingAddress()オブジェクトをしている人()オブジェクトを持っています。これは、取得/更新/作成方法/サービスと私の人()集約ルートの後ろに保護されています。

さて、どのように我々はそれを保存し、同一世帯の人たちの間でそれを共有していますか?ああ、DDDがある - あなたはDDDから直接データストアをモデル化されていません(たとえ、それがいいだろう)。そうは言っても、あなたは簡単なあなたPersonオブジェクトを提示し、単一の表を作成し、それはその中のあなたのメーリングリストのアドレスの列があります。それはあなたのリポジトリの仕事は、その情報戻ってあなたの人()とデータストアからMailingAddress()オブジェクトに水和物を再して、作成/更新操作中にそれを分割することです。

うん、あなたはあなたのデータストアになりまし重複データを持っていると思います。同じメールアドレスを持つ三人()エンティティは、すべての今、その値オブジェクトデータの3つの別々のコピーを持っている - それは大丈夫です!値オブジェクトがコピーされ、非常に簡単にdestoyedことを意味しています。 「コピー」DDDの脚本であり、最適な単語です。

だから、まとめるために、ドメイン駆動設計は、オブジェクトの実際の業務での使用を表現するために、あなたのドメインをモデル化についてです。あなたはPersoをモデル化彼らはあなたのアプリケーションでは異なって表現されるようなn()エンティティとMailingAddress値は、別々オブジェクト。あなたはPersonテーブルと同じテーブルに列が追加されていることを、彼らにコピーされたデータを永続化します。

上記のすべては、厳密-DDDです。しかし、DDDは単に「提案」、ないで生きるためのルールであることを意味します。あなたが自分自身や他の多くは、ルーズDDDスタイルの種類を行っている何をするのは自由です理由です。あなたがコピーされたデータが気に入らない場合、あなたの唯一のオプションは、(MailingAddressための別々のテーブルを作成して)、その上にID列を貼り、そして今それにそのIDを持っていたのは、あなたのMailingAddress()オブジェクトを更新することができますされているということです - あなただけ(私は個人的に第三の多対多の関係の表のように、クエリの速度を維持するために)それを共有する他の人()オブジェクトにリンクし、そのIDを使用して知っています。あなたの集約ルート/ドメインの外部に露出されることから、そのIdenity(すなわち内部修飾子)をマスクしますので、可能であれば(そのようなアプリケーションやUIなど)他の層は、MailingAddressのID列を知りません。また、私はちょうどMailingAddressのための専用のリポジトリを作成して、正しいオブジェクトにそれらを組み合わせて、あなたのPersonService層を使用することになり、Person.MailingAddress()。

暴言のため申し訳ありませんが...:)

他のヒント

まず、私はレビューは、エンティティであるべきだと思います。

第二に、なぜあなたはレビューの間の関係をモデル化しようとしていますか?私はそれらの間の自然な関係が表示されません。 「よりより具体的な」関係として有用であることがあまりにも曖昧です。

あなたが困難な状況をモデル化した場合は、

、それは多分関係がないことを示唆しています。

私はジェイソンに同意します。私はあなたの根拠はレビューの値オブジェクトを作成する何のためにあるのかわかりません。

私はあなたのメソッドは、コンテンツアイテムのコレクションを照会に基づいて決定し、それが十分に固有であるかどうかを判断するために呼び出す書評のメソッドを持つことができるように書評がBookReviewContentItemsを持っていることを期待する。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top