2009-07-25 4 views
4

"Repository"という文字列のパターンは、DomainとData Mapperレイヤの間のメディエータです。クール。したがって、たとえば、多分そうNHibernateとリポジトリパターンを使用してドメインオブジェクトのプロパティからページリストを返す方法

public interface Repository<DomainT> where DomainT : DomainObject{ 
    DomainT Get(Object id); 
} 

のようなリポジトリのインターフェースと基本ドメインオブジェクトは、その後、具体的な実装が

public class ThreadRepository : Repository<Thread>{ 
    public Order Get(Object id){ 
     return _session.Find(typeof(Thread),id); 
    } 
} 

だろうがある今、私の質問は、スレッドは次のように、多くの記事を持つことができ、これですStackOverflowは、このスレッドが300の記事を持っていると言うことができます。上記のステートメントを使用して、私はスレッドオブジェクトを取得し、20項目のリストを表示したいだけなので、ThreadオブジェクトのPost Collectionプロパティにアクセスします。これは、LazyLoadingによってすべての300がフェッチされるため、私はどうしてください。

リポジトリ上のメソッドを持つことが、より効率的であるが

GetThreadPosts(object threadID, int pageSize, int index); 
GetThreadPostCount(object threadID); 

または第二レベルのキャッシュは300件の記事を取り戻すのように、この呼び出しは、比較的安価になるだろう

と呼ばれ、私のドメインモデルを保持します。

  • 投稿数が3000または30,000の場合、スレッドドメインモデルのポストコレクションプロパティは有効ですか?

  • GetThreadPosts & GetThreadPostCountを持つ方が良い場合は、ListのThreadオブジェクトのプロパティが冗長であることを意味しますか?

  • オブジェクトのListプロパティが実行可能な場合には、特定の数を超えない可能性のあるアイテムの数が限られている場合に限ります。お時間を

おかげで、

アンドリューは、遅延ローディングが動作する

答えて

2

の方法は、それはあなたが投稿コレクションにアクセスするまで、クエリに参加するデータベースの実行を延期するということです。今では、ページに30の投稿のみを表示しようとしているときに、データベースに30000の投稿があり、条件を満たすすべてのコレクションを読み込むと無駄になります。

私の意見では、ページングは​​データベースレベルで行う必要があります。この場合、スレッドクラスからPostsコレクションを削除し、Postはスレッドに属している必要があります。これにより、クエリを作成することができます。また、singleメソッドでは、ページングされた投稿コレクションと総投稿数を取得するには十分です:

public IEnumerable<Post> GetPosts(object threadID, int pageSize, int index, out totalPosts) 
{ 
    var results = session 
     .CreateMultiCriteria() 
     .Add(GetCriteria(threadID) 
      .SetFirstResult((index - 1) * pageSize) 
      .SetMaxResults(pageSize) 
     ) 
     .Add(GetCriteria(threadID) 
      .SetProjection(Projections.RowCount()) 
     ) 
     .List(); 

    var counts = (IList)results[1]; 
    totalPosts = (int)counts[0]; 
    return ((IList)results[0]).Cast<Post>(); 
} 

private DetachedCriteria GetCriteria(object threadID) 
{ 
    return DetachedCriteria 
     .For<Post>() 
     .Add(Expression.Eq("Thread.Id", threadID)); 
} 
+0

ありがとうございます。それは非常に論理的に聞こえる!! :-) –

関連する問題