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