передать параметр в хранилище, сохраняя разделение интересов - PullRequest
0 голосов
/ 09 июля 2010

Я новичок в mvc, и весь этот способ программирования для меня довольно незнаком, так что будьте нежны ...

В моем репозитории статей:

public IQueryable<Article> GetArticles(int? category, int? position)
{
    return from a in dc.Articles
           where a.LanguageIndex == lang && a.CategoryIndex == category && a.ArticlePosition == position
           select a;
}

Как передать категорию параметров и положение из интерфейса при одновременном разделении интересов?

Я думал о:

public interface IArticleRepository
{
    IQueryable<Article> GetArticles(Article a);
}

и передачи параметров вместе с объектом Article, но это означает, что мне придется передать категорию и позицию в контроллере. Я в правильном направлении здесь?

Ответы [ 2 ]

1 голос
/ 09 июля 2010

Не уверен, как это связано с разделением интересов.Я могу видеть, где может показаться, что абстракция протекает;Вы обеспокоены тем, что кажется, что пользователи должны знать слишком много о том, как хранилище хранит ваши Статьи?

Пока кто-то не придумает эффективный метод отделения реализации от моделей, абстракции хранилища всегда будут дырявыми.Вы можете побить себя за это или просто сделать все возможное и иметь дело.

Ваш второй метод, ИМХО, хуже первого.Вы все еще должны указать категорию и позицию в своей статье, поэтому у вас все еще есть утечка в дополнение к странному API, который путает параметры с сущностями.

Я бы определенно пошел с первой версией над второй.Если бы мне нужно было что-то сделать, я бы реорганизовал создание сущностей CategoryIndex и ArticlePosition (таблицы Category и Position, связанные с таблицей Article).Затем вы можете изменить свой API на более привлекательный:

var cat = CategoryRepository.GetCategory("foo");
var pos = PositionRepository.GetPosition("bar");
var article = ArticleRepository.GetArticle(cat, pos);

Это лучше, чем у вас уже есть?Возможно нет.

0 голосов
/ 09 июля 2010

Кулак Я бы выделил основной запрос:

public IQueryable<Article> GetArticles()
{
    return from a in dc.Articles select a;
}

public IQueryable<Article> GetArticles(int? category, int? position)
{
    return GetArticles ().Where (a => a.LanguageIndex == category && a.CategoryIndex == position).AsQueryable ();
}

Теперь, если вы хотите переместить определенный фильтр запросов из своего хранилища, вы можете переместить его в метод расширения:

public static IQueryable<Article> WithCategory(this IQueryable<Article> articles, int? category, int? position)
{
    return articles.Where (a => a.LanguageIndex == category && a.CategoryIndex == position).AsQueryable ();
}
...