使用多个存储库的正确方法是什么?

时间:2011-09-15 12:50:32

标签: c# entity-framework repository-pattern

在处理多组实体时,使用存储库模式(使用实体框架)的正确方法是什么?

我应该为每个实体创建一个存储库吗? 例如: -
拥有以下实体:文章,类别和评论  我应该为每个人都有一个存储库吗?

我正在使用这样的存储库:

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

基本上每个存储库都实现所有CRUD数据(包括使用过滤器和排序获取数据),尽管我在一些博客中读到这是错误的存储库模式实现,因为存储库必须只实现基本的,通用的函数来检索和插入(删除修改) )数据 所有排序,过滤必须在内存中本地完成。

但我会在服务器端(sqlserver)进行任何操作。( 如果我只需要标题和摘要,为什么要从数据库加载所有文章(包括所有字段)?

2 个答案:

答案 0 :(得分:2)

我建议为您正在处理的每个聚合根创建一个存储库。 aggregate root是您实际想要拥有的数据结构,即您正在操作的对象,即客户,它可能具有地址,订单,发票等作为子结构(您使用这些相关子结构检索的实际客户是聚合各种表格。)

答案 1 :(得分:0)

说“这是正确的方法”总是一个冒险的肯定,但我认为你应该创建聚合(由各种表组成的实体),一旦完成,尝试了解工作单元( UoW)模式。 UoW是我用来处理多个存储库的方式。

顺便说一句,我同意zespri。在内存中排序和过滤不是一个好主意。