2011-09-15 5 views
1

여러 엔티티 집합을 사용하여 작업 할 때 엔티티 프레임 워크와 함께 저장소 패턴을 사용하는 올바른 방법은 무엇입니까?여러 저장소를 사용하는 올바른 방법은 무엇입니까?

모든 항목에 대한 저장소를 만들어야합니까?
예 :
다음 항목이있는 경우 : 기사, 카테고리 및 의견.
각각 하나의 저장소가 있어야합니까?

나는이 같은 저장소를 사용했다 :

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....       
    } 

및 샘플 저장소를 기사 :

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);    
    } 
} 

은 기본적으로 모든 저장소 I 불구하고, (필터 및 종류와 데이터를 가져 오는 포함) 모든 CRUD 데이터를 구현

저장소가 데이터를 검색하고 삽입 (삭제 수정)하는 기본, 일반 기능 만 구현해야하기 때문에 이것이 잘못된 저장소 패턴 구현이라고 일부 블로그에서 읽습니다.
모든 정렬은 필터링을 메모리에서 로컬로 수행해야합니다.

하지만 서버 측 (sqlserver)에서 수행 할 수있는 작업을 미리 수행합니다.
제목과 초록 만 필요하면 왜 데이터베이스에서 모든 기사를로드해야합니까?

+1

"모든 정렬은 필터링을 메모리에서 로컬로 수행해야합니다." - 어디서 읽었 니? 어떤 백엔드를 사용하고 있는지 확실하지 않지만 SQL 쿼리는 메모리에서 수행하는 것보다 훨씬 효율적으로 데이터를 정렬/필터링 할 수 있습니다 (각각 동일한 양의 프로그래밍을 프로그래밍 할 때). 수백만 행의 데이터를 필터링 할 수 있다면 어떨까요? –

답변

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는 여러 저장소를 다루는 데 사용하는 방법입니다.

동의어, 전 zespri에 동의합니다. 메모리에서 정렬 및 필터링하는 것은 좋은 생각이 아닙니다.

관련 문제