2011-09-15 17 views
1

エンティティフレームワークを使用して複数のエンティティを操作する場合、リポジトリパターンを使用する正しい方法は何ですか?複数のリポジトリを使用する正しい方法は何ですか?

すべてのエンティティのリポジトリを作成する必要がありますか?
例:
以下のエンティティを持つ:記事、カテゴリ、コメント。
それぞれのリポジトリを用意する必要がありますか?

私はこのようなリポジトリを使用していた

:私は

public class ArticlesRepository : BaseArticleRepository 
{ 
    public Article GetArticleById(int id) 
    { 

     var article = Contentctx.Articles.Where(o => o.ArticleID == id).FirstOrDefault();   
     return article; 
    } 

    public List<Article> GetArticles() 
    { 

     var articles = Contentctx.Articles.ToList();   
     return articles; 
    } 

    public List<ArticleHeader> GetArticlesHeaders() 
    { 
     var articles = (from article in Contentctx.Articles 
         select new ArticleHeader 
         { 
          ArticleID = article.ArticleID, 
          Title = article.Title, 
          CategoryTitle = article.Articles_Categories.Title,        
          AddedBy = article.AddedBy, 
          AddedDate = article.AddedDate, 
          ViewCount = article.ViewCount 

        }).ToList(); 


     return articles; 
    } 
    public List<ArticleHeader> GetArticlesHeaders(int PageIndex, int PageSize) 
    { 


     var articles = (from article in Contentctx.Articles 
         select new ArticleHeader 
         { 
           ArticleID = article.ArticleID, 
           Title = article.Title, 
           CategoryTitle = article.Articles_Categories.Title, 
           AddedBy = article.AddedBy, 
           AddedDate = article.AddedDate, 
           ViewCount = article.ViewCount 

         }).OrderBy(p => p.AddedDate).Skip(PageSize * PageIndex).Take(PageSize).ToList(); 

      return articles; 
} 



    public int GetArticleCount(string txtFilter) 
    { 

     int ret = Contentctx.Articles.Where(o => o.Title.Contains(txtFilter)).Count();  
     return ret; 

    } 



    public int AddArticle(Article article, int categoryId) 
    { 

      Contentctx.AddToArticles(article);    
    } 
} 

基本的にすべてのリポジトリは(フィルタと並べ替えを使用してデータを取得を含む)すべてのCRUDデータを実装し、しかし:記事のための

public class BaseArticleRepository : BaseRepository 
{ 

    private ContentModel _contentctx; 
    public ContentModel Contentctx 
    { 
     get 
     { 
      if ((_contentctx == null)) 
      {     
       _contentctx = new ContentModel(); 
      } 

      return _contentctx; 
     } 
     set { _contentctx = value; } 
    } 
    // IDisposable Support code comes here....       
    } 

とサンプルリポジトリリポジトリはデータを取得して挿入(削除)するための基本的で汎用的な関数しか実装していないので、これは間違ったリポジトリパターンの実装であることをいくつかのブログで読んでいます。
すべての並べ替えは、メモリ内でローカルに行う必要があります。

しかし、私はサーバー側(sqlserver)でこれまでにできることを実行します。
タイトルと要約だけが必要な場合は、データベースからすべての記事(すべてのフィールドを含む)を読み込む必要がありますか?

+1

"すべての並べ替え、フィルタリングはメモリ内でローカルに行う必要があります。" - どこを読んだのですか?どのバックエンドを使用しているのかはっきりしていませんが、確かにsqlクエリでは、メモリで行うよりもはるかに効率的にデータをソート/フィルタできます。フィルタリングするデータ行が100万行ある場合はどうなりますか? –

答えて

2

私が扱っている集約ルートごとにリポジトリを作成することをお勧めします。 aggregate rootは、実際にあなたが操作しているオブジェクト、つまり得意先、住所、受注、請求書などを部分構造として持つことができるデータ構造です(これらの関連する下部構造を使用して取得する実際の顧客は、 )。

+0

はい集計は私のために働くでしょう。しかし、リポジトリの実装はどうですか、私の投稿のような特定のクエリを持つのは大丈夫ですか?実装はここのように一般的でなければなりません:http://www.codeproject.com/KB/database/ImplRepositoryPatternEF.aspx – leaver

+0

厳密に言えば、リポジトリパターンはかなりダムでなければならず、ロジックはそれより上のレイヤーに座っていますが、リポジトリ内の "GetByID"などのメソッドリポジトリ内のデータアクセス層を抽象化しようとしているに過ぎません。その情報をどこで使いたいか考えてみてください。リポジトリはビジネスロジックレイヤーにデータを提示し、BLLはプレゼンテーションレイヤーにデータを表示します。これは、特定のメソッドを実装する場所に関する質問に頻繁に回答します。 – Lazarus

+0

これは素晴らしいアプローチhttp://blog.lowendahl.net/?p=249ですが、必要なすべてのクエリに対して "ICriteria"を実装する必要があります。 – leaver

0

「これは正しい方法です」と言うのは常に危険な肯定ですが、集計(さまざまなテーブルで構成されたエンティティ)を作成し、作業が完了したら、Unit Of Work (UoW)パターン。 UoWは私が複数のリポジトリに対処する方法です。

私はzespriに同意します。メモリ内でソートしてフィルタリングするのは良い考えではありません。

関連する問題