6

私たちは新しいプロジェクト (既存のアプリを書き直す) に取り組んでおり、ドメイン モデル / リポジトリの設計で問題が発生しています。

これは、ドメイン モデルの 2 つの重要な部分の (簡略化された) バージョンです。

代替テキスト

ご覧のとおり、私はPostの抽象的な概念を持っています。これは、レビュー、ディスカッション、写真、ビデオなどのようなものです。投稿にはコメントを含めることもできます。

また、場所の抽象的な概念もあり、これは明らかに通り、都市、近隣などです。

さて、これは自然に私には 2 つの明確な集合根として見えました。

そこで、2 つのリポジトリを作成しました。1 つはPostRepositoryと呼ばれ、もう1 つはLocationRepositoryと呼ばれます。

これはすべて正常に機能していました。これら 2 つのリポジトリのいずれかを介して、任意のタイプの投稿 (またはコメント) を追加/取得し、任意のタイプの場所を追加/取得できます。

しかし、今は都市の「ランディング ページ」のシナリオにいます (たとえば)。

このページでは、基本的に「この場所のすべての投稿」を表示する必要があります。

それはどのように定義されていますか?まあ、投稿は(オプションで)場所でタグ付けできます。実装の詳細なので、データに深く入り込みたくはありませんが (それは DDD の目的ではないため)、基本的には、場所のシェープ ファイルによって特定の場所にどの投稿が含まれているかを判断するための地理空間インテリジェンスがあります。タグ付けされた投稿の緯度/経度。

しかし、境界を越えずにこの情報を取得するにはどうすればよいでしょうか?

どのリポジトリを使用しますか? 新しいものが必要ですか?

重要な場合 (または好奇心旺盛な場合)、これは SQL Server 2008 データベースと Entity Framework 4.0 を備えた Web アプリケーション (ASP.NET MVC) です。

説明が必要な場合はお知らせください。

編集

現在、ドメイン モデルを取得するために仕様パターンの修正版を使用しています。

たとえば、スコア >= 4 のすべてのレビューを取得する BLL のコードは次のとおりです。

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 を追加することです。

でもそうする事で、私は総計の境界を越えていますね。

4

3 に答える 3

9

なぜこれが問題なのですか?Evans の著書によると、1 つの AR が別の AR を参照している可能性が非常に高くなります。(ただし、別の AR から AR の子要素を参照することはできません)

また、場所は本当に集約ルートですか? 集約ルートの定義は、一貫性の境界として機能することです。それは場所の定義に適合しますか? 場所は値オブジェクトだと思います。

ここには、リポジトリと AR 関連付けに関して、ほぼ 2 つの陣営があります。

すべての集約ルートそれぞれのリポジトリから取得する必要があり、AR はそれらの間の ID などのソフトな関係を使用する必要があると言うもの

そして、集約ルートは他の関連する集約ルートを取得する可能性が非常に高く、リポジトリは集約ルートを見つけるための単なる方法であると述べています。

于 2010-11-26T09:36:45.787 に答える
6

作成時に投稿を場所にバインドして、場所ごとに (リポジトリを介して) 関連する投稿のリストを取得できるようにします。次のようになります。

作成:

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 つの問題があります。新しい場所を追加するには、すべての投稿をスキャンして新しい場所に割り当てる必要があります (該当する場合)。

それが役立つことを願っています。

于 2010-11-26T05:30:43.140 に答える
0

Specification パターンを使用したとしましょう。Location オブジェクトを使用して Post Specification を構築できますか? 次に、仕様を Post リポジトリに渡すだけで、結果が返されます。

于 2010-11-26T03:44:50.590 に答える