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

本文关键字:方法 是什么 存储 | 更新日期: 2023-09-27 18:08:35

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

我应该为每个实体创建一个存储库吗?
例如:
有以下实体:文章、分类和评论。
我应该为每一个存储库吗?

我是这样使用仓库的:

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)。
为什么我应该从数据库加载所有的文章(与所有字段),如果我只需要标题和摘要?

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

我建议为您正在处理的每个聚合根创建一个存储库。聚合根是您实际想要作为您正在操作的对象的数据结构,例如,Customer,它可能具有Address, Orders, invoice等作为子结构(您使用这些相关子结构检索的实际客户是各种表的聚合)。

说"这是正确的方法"总是一个有风险的断言,但我认为您应该创建聚合(由各种表组成的实体),一旦完成,尝试学习工作单元(UoW)模式。UoW是我用来处理多个存储库的方法。

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