Как правильно использовать несколько репозиториев? - PullRequest
1 голос
/ 15 сентября 2011

Как правильно использовать шаблон репозитория (с платформой сущностей) при работе с несколькими наборами сущностей?

Должен ли я создать хранилище для каждой сущности?
e.g.:
Имеются следующие объекты: Статьи, категории и комментарии.
Должен ли я иметь хранилище для каждого?

Я использовал репозиторий вот так:

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 ]

2 голосов
/ 15 сентября 2011

Я бы предложил создать хранилище для каждого агрегатного корня, с которым вы имеете дело. Совокупный корень - это структура данных, которую вы на самом деле хотите иметь в качестве объекта, которым вы манипулируете, т. Е. Клиент, он может иметь в качестве подструктур Адрес, Заказы, Счета и т. Д. (Фактический клиент, которого вы извлекаете с помощью связанных подструктуры совокупность различных таблиц).

0 голосов
/ 15 сентября 2011

Сказать «Это правильный путь» - это всегда рискованное утверждение, но я думаю, что вы должны создать агрегаты (сущности, которые составлены из разных таблиц), и, как только это будет сделано, попробуйте узнать об Единице работы (UoW) шаблон.UoW - это способ, которым я использую для работы с несколькими хранилищами.

Кстати, я согласен с zespri.Сортировать и фильтровать в памяти не очень хорошая идея.

...