将参数传递给存储库,同时保持关注点分离

时间:2010-07-09 15:35:20

标签: asp.net-mvc interface repository-pattern separation-of-concerns

我是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 个答案:

答案 0 :(得分:1)

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

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

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

我绝对会选择第一个版本。如果我要做任何事情,我会重构使CategoryIndex和ArticlePosition实体(分类和位置表链接到Article表)。然后,您可以将API重构为更具吸引力的API:

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

这比你现有的更好吗?可能不是。

答案 1 :(得分: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 ();
}