2017-06-25 7 views
0

のは、我々は単純なデータ構造を持っているとしましょう:enter image description here一部のエンティティが共有されている場合の集約の識別?

どちらも、InterfaceNetwork Printerは(強制FKSで)別のテーブルに格納されているEndPointを、持っています。たとえば、InterfaceにはEndPoint’sのポート番号が必要です.1000-2000とNetwork Printerには、2000〜3000の間のポート番号が必要です。 EndPointは、実際に直接アクセスする必要がないため、そのコンテキストを知らなくてもエンドポイントの値を直接変更したくないため、集約ルートにすることはできません。 Per this post:あるアグリゲートに何かが属している場合、他のアグリゲートはそれを読み取り専用データと呼ぶかもしれません。それはEndPointInterfaceNetwork Printerに属していないことを意味しますか?または、私の場合のように、同じEndPointインスタンスは、2つの集約の間で共有されることはありません。したがってInterfaceNetwork Pritnerは常にそれ自身のEndPointを更新する予定であり、一貫性の違反は起こりません。そうだね?

答えて

3

あなたのドメインは説明されていませんが、私にはEndPointはエンティティのようには聞こえず、むしろ値(不変)になります。エンドポイントを変更するには、古いEndPointの値をすべて新しい値に置き換えるだけです。変更不可能な値は、問題なく、集約インスタンス間で共有される可能性があります。

EndPointがエンティティでなければならない場合、のインスタンスは集約全体で共有されません。複数の集約で同じ種類のエンティティを使用する場合の制限はありません。

+0

ありがとうございます。実際にはIDフィールドを持つテーブルに格納されていても、ValueObjectとして表現することができます。ドメインレベルで公開されていないIDですか? – Tenek

+0

@Tenekあなたは単に同じテーブルにデータを持つことはできませんか?つまり、値であっても専用のエンドポイントテーブルを持つことができますが、パーシスタンスモデルの観点からはエンティティになり、モデルの観点からは値(隠れたIDである可能性が高い)になります。 – plalx

+0

データはレガシーDBからのものです。今のところEndPointテーブルは3つの異なる場所から参照されますが、値は決して共有されません。とにかくEndPointはそのリポジトリからリポジトリで参照できるので、私はドメインオブジェクトのために隠されたIDフィールドを行うか、まったくそれを避けます。 EndPointを値オブジェクトとして使用すると、リポジトリが公開されず、全体構造が単純化されなくなりました。アドバイスをありがとう! – Tenek

関連する問題