0

我是 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 对象一起传递,但这意味着我必须在控制器中传递类别和位置。我在这里的方向正确吗?

4

2 回答 2

1

不确定这与关注点分离有何关系。我可以看到抽象似乎有漏洞的地方;您是否担心用户似乎必须对存储库如何保存您的文章了解太多?

在有人提出一种将实现与模型分离的高性能方法之前,存储抽象总是会泄漏的。你可以打败自己,或者只是尽力而为。

恕我直言,您的第二种方法比第一种方法更糟糕。您仍然必须在文章中规定类别和位置,因此除了将参数与实体混淆的奇怪 API 之外,您仍然存在泄漏。

我肯定会选择第一个版本而不是第二个版本。如果我要做任何事情,我会重构以创建 CategoryIndex 和 ArticlePosition 实体(链接到 Article 表的 Category 和 Position 表)。然后,您可以将您的 API 重构为更具吸引力:

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

这比你已经拥有的更好吗?可能不是。

于 2010-07-09T15:48:02.800 回答
0

拳头我会分离出基本查询:

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 ();
}
于 2010-07-09T19:59:14.407 回答