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