私たちのものを次のようにモデル化することは確かに可能です:
Universe.Instance.Galaxies["Milky Way"].SolarSystems["Sol"]
.Planets["Earth"].Inhabitants.OfType<Human>().WorkingFor["Initech, USA"]
.OfType<User>().CreateNew("John Doe");
たぶん、リポジトリインスタンスは「エンド開発者」に見えてはならず、モデルにカプセル化されるべきではありません。
ただし、に簡単にアクセスできない可能性があるためUniverse.Instance、実際にデータを取得する場所への1つ以上の「エントリポイント」が必要です。
アップデート:
「BingBang」は1つしかないので、現実の世界に近づくので、「リポジトリファサードの入り口」の数をできるだけ少なくすることが目標だと思います。から来て、最終的にすべての既存のデータを生み出しました;-) ...とはいえ、もちろん、今日のシステムは常に大きな妥協点であり、現実の世界をモデル化する能力は限られているため、パフォーマンスがあります影響など...
ただし、具体的な例を示す1つの方法は、次のように、リポジトリを使用して常に新しいデータを取得することです。
LocationRepository.Instance.GetUserLocations(userId);
...一方、次のように、Userモデルクラスを使用して結果をプロパティに保持します。
var locations = myUser.Locations;
このプロパティは、遅延読み込み手法を使用して、最初の要求でLocationRepositoryからデータを読み込み、次に結果を保持します。これにより、場所が1回だけ読み込まれることがわかり、ライブラリを使用する開発者にとって便利になります。次に、LocationRepository.GetUserLocation(userId)をエンド開発者にも表示するかどうかを決定できます。そのルートを進むときは、ある種の暗黙的および明示的な更新メカニズムとライフタイム管理も構築する必要があることに注意してください。
この全体的なアプローチは、私にとって非常に役立つことが証明されています。ただし、Silverlight etálの非同期の世界では、いくつかの新しい警告が追加されています。このようなプロパティは、コードの1行で新しい値と即座に同期して更新できなくなったためです。更新をリクエストするときは、バインディングテクニックを活用するか、コールバックを使用して、更新された値をさらに処理できるようにする必要があります。
全体として、私が信じる最終的な目標は、たとえば、UserRepository新しい単一Userインスタンスを作成してユーザーのストレージに追加し、フィルター処理されたビューを提供する責任がある、たとえば別の通常のドメインタイプと同じように表示することです(クエリ)利用可能なすべてのユーザー。同じ結果への参照を保持するmyUser.Locationsだけでなく、許容されます。myLocations.ByUser["John Doe"]これは、たとえばUserRepository、それを保持する責任がある別のクラスのプロパティである可能性があります。CompanyStaffそのアイデアをさらに推し進めることが、私をそのUniverse.Instanceことに導いたのです。;-)