2011-01-13 3 views
0

を考えると、次のエンティティ:このPolymorphic Associationを正しくモデル化するには?

コンテナ
ユーザー
クライアント
機関コンテナエンティティは、プロパティAssignedToPartiesを介して1つまたは複数の関係者に関連付けられてい

Container.AssignedToPartiesには、ユーザー、クライアント、および機関が混在することがあります。

この関係の推奨ドメインモデルとは何ですか?

私は、次のオプションを検討していた:

1)タイプごとに別々のプロパティを作成します。

Container.AssignedToUsers
Container.AssignedToClients
Container.AssignedToInstitutions

をこれはかなりいるようですビジネスロジックがタイプをチェックしたり、ダウンキャストを行う必要はありません。

2)その後、党のエンティティのコレクションになるユーザー/クライアント/機関

Container.AssignedToPartiesの共通基本クラス「党」を作成します。パーティーの基本クラスはメソッドやプロパティを持たないので、これは簡単な解決策のようです。私はまた、ここにもう一つの継承層を追加する考えが好きであるかどうかはわかりません。

#3のように、この解決策では、実行時に型をチェックして決定を下し、次にユーザー/クライアント/機関のいずれかにダウンキャストして処理する必要があります。

3)は、ユーザ/クライアント/機関そのマーカーインタフェースIContainerAssignableを作成

これは、少なくともいくつかの型の安全性を提供するだろうが、型チェックとダウンキャストを必要とするを実装します。

今、私は#3に向かっています。それは最もシンプルなようですが、あなたのコードがロジックを実行していて、与えられたタイプとダウンキャストをテストしなければならないロジックを実行していると、おそらくは悪いデザインがあると思います。

アドバイスありがとうございます。

+0

異なるコンテナに存在するのではなく、コンテナを共有したいユーザー、クライアント、機関の共通点は何ですか? – Paul

+0

コンテナにユーザー/クライアント/機関が含まれていません。ファイルなどのアセットのリストを表すドメインオブジェクトです。ユーザー/クライアント/機関は、コンテナに関心を示すためにコンテナに関連付けられています。コンテナを「見ている」と考えることができます。ちょうどFYI、クライアント/ユーザー共通の基本クラスPersonを共有します。機関は実際にはPersonではなく、コンテナへの割り当て可能性を除けば、プロパティ/ビヘイビアに関してClient/Userと何も共有しません。 – bzarah

答えて

0

私の質問に答えてあなたのコメントに基づいて、私はコンテナによって全く処理されないでしょう。あなたの例を使用するには、ファイルはそれを見ている人を知らないし気にもしません。

代わりに、ウォッチャーにコンテナの監視を開始するためのメソッド(またはコレクションプロパティ)を実装させるか(その場合、IContainerWatcherなどを使用することで意味があります)パブリッシュ/サブスクライブメカニズムのように、アソシエーションを維持することに専念するサービスに完全にオフロードされます。これは概念的には、データベース・スキーマの多対多の結合表に似ています。

+0

私は、質問に焦点を当てるために少し例を単純化しました。私たちのビジネスでは、コンテナが誰を見ているかを知ることが重要です。コンテナは、誰がそれを「見ている」かに依存する、非常に複雑なオブジェクトです。これらのエンティティ間の関係を逆方向に、すなわちクライアント/ユーザ/機関に関連するコンテナを参照することができることも重要である。 IContainerWatcherは#3(IContainerAssignable)に類似していますか? Markerクラスの使用についてのあなたの意見は何ですか? ありがとう! – bzarah

+0

マーカーインターフェイスは、インテントなどを宣言するのに便利です。つまり、コンテナが変更されたとき(Observerパターンのような)の一般的なメソッドまたはイベントであっても、それらの間に共通の動作がないかどうかを確認しようとします。 – Paul

関連する問題