4

FluentNHibernateとLinqtoNHibernateを使用して適切なドメインアーキテクチャをセットアップしようとしています。コントローラーがリポジトリクラスを呼び出しています。リポジトリクラスは、内部でNHibernateに感謝し、データのICollectionを返します。これは、データアクセスを抽象化し、NHibernate機能を「ファインプリント」で維持するため、うまく機能しているようです。

ただし、現在、コントローラーが異なるコンテキストで同じデータ呼び出しを使用する必要がある状況を見つけています。たとえば、私のリポジトリはユーザーのリストを返します。これは、ユーザーのリストを表示したい場合には便利ですが、子クラスを利用して役割などを表示したい場合は、SELECT N+1の問題が発生します。NHibernateでそれを変更して、代わりに結合を使用する方法を知っていますが、私の具体的な質問は、このロジックをどこに置くかです。すべてのGetAllUsers()呼び出しでロールを返す必要はありませんが、一部のロールを返す必要があります。

だからここに私が見る私の3つのオプションがあります:

  1. マッピングの設定を変更して、ロールがクエリに結合されるようにします。
  2. GetAllUsers()とGetUsersAndRoles()の2つのリポジトリ呼び出しを作成します。
  3. IQueryableオブジェクトをリポジトリからコントローラーに返し、NHibernateExpandメソッドを使用します。

これをうまく説明できなかったらごめんなさい。私はちょうどDDDに飛び込んでいますが、この用語の多くはまだ私にとって新しいものです。ありがとう!

4

4 に答える 4

2

lomaxxが指摘しているように、query.Expandが必要です。

リポジトリがあらゆる状況であらゆる種類のメソッドで隠されるのを防ぐために、構成可能なクエリを作成するクエリオブジェクトを作成できます。

ICriteriaAPIを使用したいくつかの例をブログに投稿しました。ICriteria APIにはFetchMode代わりにがありますExpandが、考え方は同じです。

于 2010-05-11T13:59:16.977 に答える
1

私はすべてのクエリロジックをリポジトリに保持し、リポジトリからICollectionのみを返すようにしています。

あなたの状況では、いくつかのパラメーターを渡して、ロールをロードするかどうかを決定し、そのようにIQueryableを構築します。例えば:

GetAllUsers(bool loadRoles)
{
    var query = session.Linq<Users>();
    if(loadRoles)
       query.Expand("Roles");
    return query.ToList();
}
于 2010-05-11T13:52:48.293 に答える
0

2つを選択し、2つのリポジトリを作成します。そして、おそらくGetRoleByUser(User user)への別のリポジトリ呼び出しを作成することを検討します。したがって、必要に応じて、別のスレッドでユーザー選択を変更したときにユーザーの役割にアクセスできるため、パフォーマンスが向上し、ほとんどのリソースを必要とするユーザーごとにすべてのユーザーの役割が読み込まれることはありません。

于 2010-05-11T13:54:17.587 に答える
0

GetAllUsers()ユーザーエンティティのみを返す場合と、ユーザーとロールを返す場合があるかどうかを尋ねているようです。

と呼ばれる別のリポジトリメソッドを作成するかGetRolesForUser(User user)、ロールに遅延読み込みを使用するか、GetAllUsers(bool loadRoles)lomaxxの回答で言及されているものを使用します。

私はあなたのリポジトリで遅延読み込みの役割または別の方法に傾倒します。

于 2010-05-11T13:58:00.857 に答える