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

これが懸念の分離にどのように関連するかはわかりません。抽象化が漏れているように見えるところがわかります。リポジトリがあなたの記事をどのように保持しているかについて、ユーザーが少しばかり知っているように見えるのは心配ですか?

実装をモデルから分離する効率的な方法を誰かが思い付くまで、ストレージの抽象化は常に漏れやすいものです。あなたはそれに打ちのめされるか、最善を尽くして対処することができます.

あなたの2番目の方法は、私見ですが、最初の方法よりも悪いです。記事のカテゴリと位置を規定する必要があるため、パラメーターとエンティティを混同する奇妙な API に加えて、リークがまだ残っています。

私は間違いなく2番目のバージョンよりも最初のバージョンを使います。何かをする場合は、リファクタリングして 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 に答える