2009-08-26 11 views
5

二つの部分からの質問DDDのprinciplersとASP.NET MVCプロジェクトの設計

私が持っている製品の集計を持っています。私は1つの製品リポジトリをモデル化していると、子クラスのいずれかのために個々のリポジトリを作成していない

価格 PackagingOptions ProductDescriptions ProductImages など

。すべてのdb操作は、製品リポジトリを介して処理されます。

私は今までDDDの概念を正しく理解していますか?時にはリポジトリを持っていると、パッケージリポジトリにPackagingOptionsコレクション内でそれを見つけ出すように頼むのではなく、そのIDを使ってDBからパッケージオプションを直接取得することで、私にはそれが...

2番目の部分はASP.MVCフレームワーク

を使用した操作が、私は現在、すべての製品のコントローラを介して製品のこれらの子コレクションの編集削除を追加し、管理しようとしています作成、編集を管理している(右の音? )。

私は今直面している課題です。

私は/製品/ editpackagingoption

はmydomain /を通じて、製品の具体的なパッケージングオプションを編集する場合は10

私はパッケージングオプション

のIDへのアクセスを持っている。しかし、私が持っていませんそれは自己の製品のIDであり、これにより、この特定のパッケージングオプションを持つ製品を最初に見つけて、その製品と革新的なパッケージングオプションを編集するためのクエリを書く必要があります。私はすべてのパッケージングオプションが一意のIDを持っているので、これを行うことができますが、一意のIDを持たないコレクションがあればこれは失敗します。非常に間違って感じている

..

私のようなURLで製品や包装オプションIDの両方を送信していると考え、次のオプション。

はmydomain /製品/ editpackagingoption/3月10日

しかし、それはどちらか良いデザインであるかどうかはわかりません。

私はちょっと混乱しています。これに関するすべての基本的な誤解があるかもしれません...

長い質問に耐えて、一緒に置くのを助けていただければ幸いです。ありがとう!

+0

良い質問を心配する必要はありません。私はそれに答えることはできませんが、製品IDを持っていないビットで、それは重要ですか?それが1対1の場合、おそらくPackingOptionはそれ自身のProductIDを持つべきでしょうか? – jeef3

+0

データベースに保持されているproductidがあります。挑戦は、私がパッケージング・リポジトリを持たずにそこにいかに入るかです。 – kaivalya

答えて

3

私の考えでは、これはDDDに飛びつく泥だらけのものの1つです。

コードでは、集約ルートは、それが持つ「関係」と、集約ルートなしでは存在できない任意のエンティティオブジェクトのコンテナとして扱われます。

たとえば、今までに狙ったCustomer-> Order-> LineItem-> Productの例を考えてみましょう。このシナリオでは、私が表示した集約ルートは顧客です。それは、あなたはいつも顧客を通して注文に行きたいとは限りません。あなたは、特定の日付に注文を見つけることができます。

これを有効にすると、注文を受けていない顧客もいなくなります。 2つは幾分共生関係にあるので、一方は他方の集約ルートではありません。

重要なことは、注文から顧客をロードする必要はないが、必ずしも顧客から注文をロードする必要はないということです。

しかし、Orderからは、LineItemを取得するだけではなく、オーダーなしで作成することは確実ではありません。そのために、OrderはLineItemへのゲートウェイとして機能します。 LineItemsは独自のコントローラやリポジトリを必要としません。それらはOrder内にのみ存在し、Orderの一部である(この場合、Orderは集合ルートになる)、Order Entityによって管理される。

ただし、LineItemはシステム内のProductとの関係を持つ可能性があります。製品はAggregateルートの外に存在する可能性があるため、独自のコントローラ、リポジトリなどを持ちます。

要約すると、私はそれをこのように見ている傾向があります。エンティティが単独で存在することができれば、コントローラーが必要です。独自に存在できないエンティティ(この場合はLineItems)は、コンテナ(集約ルート)によってのみ管理される必要があります。

私が間違っている場合、一部のDDD純粋主義者が私を修正しますか?

質問の2番目の部分については、これらの他のエンティティがどのように動作しているかを詳細に調べる必要があります。あなたがここに入れたもので、私はPackagingOptionsが製品に関連していてProduct集約ルートの一部であると思います。さて、あなたがそれらを編集していることを暗示しているのは、これがシステム内のルックアップテーブルなのか、それとも一回限りの値なのかを問うことです。そのため、値オブジェクトとして扱うべきですか?

+0

あなたの答えをありがとう。これらの質問をすべて集めた根本的な集約のために私の自己をより根本的なアプローチに導くまでは、私たちは同じページにいたようです。私は価値オブジェクトでなければならないと思います、私は再びそれを調べます。しかし、私の質問は、私は、コントローラに子エンティティのIDを渡す集約ルートのエンティティの編集シナリオを行う方法についてのままで、それはすべての残りの部分を処理するために、アグリゲート制御点で最大である - 私は一種の集約IDの両方を送信する方に共鳴しますそして、子IDこれらのケースについて、それでも、私は、子エンティティがIDを持っており、そのエンティティを編集する必要がある場合、それは独自のコントローラを保証することを主張するだろう – kaivalya

+0

汚い感じています。親関係を取得する場合は、1:1の場合は、親IDを子と一緒に保存し、それを取得するだけですが、親を保存して、独自のIDを持つ子を変更することは、少し匂いがします。エンティティ自体を編集している場合は、集約を編集していないので、独自に立つことができるはずのものがあります。注文を読み込んで商品を編集しても機能しないように思えます。また、バリューオブジェクトにはIDはありません。 – andymeadows

+0

エンティティと値オブジェクト上の議論の出発点としてhttp://devlicio.us/blogs/casey/archive/2009/02/13/ddd-entities-and-value-objects.aspxを参照してください。 – andymeadows

1

Kaivalya、あなたの最後のコメント(ステートレスHTTP)について

それは文脈に依存します。詳細に入る前に、私は集約に関する基本原則を教えてください:

集約は、データ変更の目的で単一の単位として扱われるべきである関連オブジェクトのグループを定義します。

これは非常に重要です。 Aggregatesを持つ目的は、不変量を強制することです。たとえば、「注文は500ドルを超えることはできません」というポリシーがあります。次に、このポリシーを適用するために、OrderとOrderItemをOrder Aggregateにまとめます。この方法では、新しいOrderItemを追加するたびにOrderオブジェクト経由で追加する必要があります。そこでは、合計価格を確認して、$ 500を超えないようにすることができます。ドメイン内にそのような不変量がない場合、これらのオブジェクトをすべて一緒にロードするポイントはありません。

さて、戻ってあなたのコメントを取得:

あなたが施行されるべき不変条件を持っている場合は

、それはいくつかのオーバーヘッドを持っていたとしても、全体の集計をロードしても大丈夫です。はい、HTTPはステートレスなので、子オブジェクトの1つを変更するためだけに集約全体をロードしてからスローします。それはオッケーです。ここで最も重要なことは、あなたが不変量を適用していることです。これがDDDの目的です。

DDDの目的は、ドメイン内のすべてのビジネスロジックを取得することです。集約全体をロードする必要がない場合は、より良いパフォーマンスを達成できますが、インバリアントをどのように適用しますか?あなたはおそらく、ストアドプロシージャでそれを行う必要があります。はい、動作しますが、高速ですが、保守中のストアドプロシージャのビジネスロジックを扱うことは悪夢です。それがDDDが進化した理由です。したがって、オブジェクト指向言語/ツールを使用してビジネス要件をモデル化できるため、理解しやすく変更することができます。

ただ、DDDは、プロジェクトのすべてのタイプのための偉大なアプローチではなくである、覚えておいてください。ビジネスロジックがたくさんあり、事業の性質上変化する可能性が高いプロジェクトを扱う場合は、DDDを使用する必要があります。しかし、ビジネスロジックをあまり使わずにプロジェクトが「何かを読んだり、何かを書いている」ものであれば、DDDを使うのは頭痛です。 LINQ to SQL(またはSqlDataAdapters)を使用して、ビューにオブジェクトを送信するだけで済みます。あなたも、見つけるのエンティティ、値オブジェクト、集計、リポジトリなど

・ホープ、このことができますについて

モッシュ

関連する問題