DDD-ここで集計境界を越えないようにするにはどうすればよいですか?
-
28-09-2019 - |
質問
私たちは新しいプロジェクト(既存のアプリの書き直し)に取り組んでおり、ドメインモデル /リポジトリデザインの問題に遭遇しています。
ドメインモデルの2つの重要な部分の(単純化された)バージョンを次に示します。
ご覧のとおり、私は抽象的な概念を持っています 役職, 、レビュー、ディスカッション、写真、ビデオなどのようなものです。投稿にもコメントがあります。
aの抽象的な概念もあります 位置, 、明らかに街路、都市、近所などのようなものです。
今、これは当然、私に2つの明確な総根として見えました。
そこで、2つのリポジトリを作成しました。1つは呼ばれます Postrepository, 、そして別の呼びかけ LocationRepository.
これはすべて正常に動作していました。あらゆる種類の投稿(またはコメント)を追加/取得し、これら2つのリポジトリのいずれかを介してあらゆるタイプの場所を追加/取得できます。
しかし、今では都市の「ランディングページ」のシナリオにいます(たとえば)。
このページでは、基本的に「この場所のすべての投稿」を表示する必要があります。
それはどのように定義されていますか?まあ、投稿は(オプションで)場所でタグ付けすることができます。実装の詳細なので、私はデータを深く掘り下げたくありません(DDDの目的ではありません)が、本質的には、場所の形状ファイルによって特定の場所に含まれる投稿を計算するための地理空間インテリジェンスがあります。タグ付きポストの緯度/経度。
しかし、境界を越えずにこの情報を取得するにはどうすればよいですか?
どのリポジトリを使用していますか?新しいものが必要ですか?
重要な場合(または好奇心が強い場合)、これはSQL Server 2008データベースとエンティティフレームワーク4.0を備えたWebアプリケーション(ASP.NET MVC)です。
明確化が必要な場合は、お知らせください。
編集
現在、ドメインモデルを取得するために、仕様パターンの変更されたバージョンを使用しています。
たとえば、これは私たちのBLLのコードであり、すべてのレビューを取得する場所> = 4:
var reviews = postRepository // GenericRepository<Post>
.Find() // IQueryable<Post>
.OfType<Review>() // IQueryable<Review>
.Where(x => x.Score >= 4)
.ToList(); // List<Review>
しかし今、私はこのようないくつかのコードが必要です:
var reviews = postRepository
.Find()
.OfType<Review>()
.Where( //lat long, or Locations FK )
.ToList();
問題は、中間の結合エンティティ(LocationPost-多くの人にとって)を追加せずに上記のクエリを行う方法がわからないこと、およびPostドメインモデルにFKを追加することです。
しかし、それをすることで、私は総境界を越えています - 私はそうではありませんか?
解決
作成時に場所に投稿をバインドして、各場所で(リポジトリを介して)関連する投稿のリストを取得できるようにします。このようになります:
作成:
var p = new Post(latitude, longitude);
var locations = locationRepository.FindByCoordinates(latitude, longitude);
foreach (var l in locations)
{
l.AssociatePost(p);
}
session.Save(p);
検索:
var associatedPosts = postRepository.FindByLocation(locationId);
foreach (var p in associatedPosts)
{
Display(p);
}
ボンネットの下では、ポストと場所の間の関連性は、多くのテーブル関係として実装されます。このソリューションには1つの問題があります。新しい場所を追加するには、すべての投稿をスキャンして新しい場所に割り当てる必要があります(該当する場合)。
それが役立つことを願っています。
他のヒント
なぜこれが問題なのですか?彼の本の中でエヴァンスによると、1つのARは別のARを非常によく参照するかもしれません。 (ただし、別のARからARの子要素を参照することはできません)
また、場所は本当に根の総計ですか?集合ルートの定義は、濃度の境界として機能することです。それは場所の定義に適合しますか?場所はバリューオブジェクトだと思います。
ここには、リポジトリとAR協会に関する2つのキャンプがあります。
すべての総根を言うもの した方が良い それぞれのリポジトリを介してフェッチすると、ARはソフトリレーションを使用する必要があります。
そして、総根は他の関連する骨材の根を非常にうまく取得し、リポジトリは単なる総根を見つける方法にすぎないと言うものです。
仕様パターンを使用したとしましょう。ロケーションオブジェクトを使用して投稿仕様を作成できますか?次に、仕様をポストリポジトリに渡すだけで、結果を取り戻します。