10

この質問には次のレイヤーが関係しています。

  • サービス層(IoCを使用してリポジトリを呼び出す)
  • ドメインモデル(POCO /ドメインエンティティ、定義されたリポジトリインターフェイス)
  • リポジトリレイヤー(EF .edmxおよび実装されたリポジトリ)

多くの場合、これは非常に簡単です。リポジトリレイヤーは、Entity Frameworkを介してデータベースにクエリを実行し、IList<SomeDomainEntity>サービスレイヤーである呼び出し元に戻ります。返されるタイプは、ドメインモデルで定義されたタイプです。

私が遭遇している問題は、POCO A、B、およびC間でクエリを実行し、返されるすべてのデータを取得する必要がある場合です。リポジトリ内のロジックを処理しないため、このデータをサービスレイヤーに戻して処理する必要があります(直接、またはドメインモデルでロジックを呼び出すことにより)。ただし、リポジトリクエリの結果から呼び出し元に返す単一のタイプはもうありません。

もちろん、匿名タイプは、私が見る例でこれを処理しますが、リポジトリ内で返されたデータからそのロジックを直接処理しておらず、返す必要があるため、返すには物理タイプが必要です。これが私が考えたいくつかの解決策ですが、私が好きかどうかはわかりません:

  1. ドメインモデルに新しいドメインエンティティを作成します。これは、基本的に、クエリしたすべてのデータの合成であるため、この新しい単一のタイプが返される場合があります。これは、満足のいくクエリのニーズに合わせてabritraryタイプを作成するのは間違っているようです。
  2. サービスレイヤーでA、B、Cエンティティの個々のリポジトリを個別に呼び出してから、返された各オブジェクトからのデータを処理します。これは多くの余分な作業のようです。
  3. 返すViewModelを作成します。これは私にも場違いのようです。私はサービスレイヤーとUIレイヤーの間でViewModelクラスを多用していますが、リポジトリからの戻りにそれらが活用されているのを見たことがありません。

タイプに追加して呼び出し元に返す必要のあるデータの集合体を取得するために、複数のエンティティ間でクエリを実行するのは私だけではありません。私の問題を解決するためにこれを行うための一般的な方法または標準的な方法は何ですか?

ありがとう!

4

3 に答える 3

8

それらのエンティティが関連していて、それらすべてを1つの場所でクエリする場合は、ドメインモデルでそれらの集約ルートを見つけようとするか、まだ存在しない場合は、最初に述べたように、新しいエンティティを導入する必要があります。オプション。それが理にかなっているまで、これは間違いではありません。ドメインの概念をモデル化する必要があり、そのリポジトリメソッドを作成したため、おそらくドメインの概念があります。

それらのエンティティが関連しておらず(おそらく何らかの形で関連しているが、上記のように緊密ではない)、一度に取得したい場合は、複数のリポジトリを使用して構成できるサービスレイヤーでそれを処理する必要があります。結果オブジェクト。

ナビゲーションプロパティ積極的な読み込みの概念について聞いたことがあるかもしれませんが、それはあなたの質問に対する別の答えかもしれないので、ここに書きます(あなたのドメインモデルはわかりません)

分離が崩れるため、3番目の提案(リポジトリにビューモデルを作成する)は使用しません。

于 2013-02-20T17:55:54.133 に答える
3

異なるエンティティは、それらの1つが集約ルートでなくても、相互に関連付けることができます。サービスは、この種のクエリに使用されます。私は通常次のようなことをします:

public class MyService
{
    IEnumerable<UserWithMessages> Find()
    {
        var messages = _messageRepository.FindAll();
        var userIds = _messages.Select(x => x.UserId).Distinct().ToArry();
        var users = _userRepository.Find(userIds);
        return users.Select(x => new UserWithMessages(x, messages.Where(x => x.UserId == x.Id));
    }
}

DB内のインデックスを利用できるのは2つのDBクエリだけです。だからそれはかなり速いはずです。

于 2013-02-21T07:07:43.177 に答える
1

この目的には、DTO(データ転送オブジェクト)を使用することをお勧めします。サービスレイヤーをビューから分離するのが一般的な方法であり、DTOを使用すると、ビューに必要な重要な情報のみを共有できます。

システムのサイズに応じて、システムのこの部分を実装するさまざまな方法があります。小規模なシステムでは、拡張メソッドを使用して、POCOエンティティをデータ転送オブジェクトにマッピングできます

「AutoMapper」をご覧になることをお勧めします。これはあなたにとって本当に役立つと思います

http://www.codeproject.com/Articles/61629/AutoMapper

http://lostechies.com/jimmybogard/2009/01/23/automapper-the-object-object-mapper/

于 2013-02-20T17:58:17.603 に答える