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); 
} 

和传递参数与第对象一起,但这意味着我将不得不通过在控制器中的类别和位置。 我在这里正确的方向?

回答

1

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

直到有人想出一个从模型中分离实现的高性能方法,存储抽象将始终存在漏洞。你可以打败自己,或者尽力而为。

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

我肯定会在第二个版本中使用第一个版本。如果我要做任何事情,我会重构使CategoryIndex和ArticlePosition实体(类别和位置表链接到文章表)。然后你可以重构你的API到更具吸引力:

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

这是比你已经有什么更好?可能不会。

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(); 
}