2012-04-15 4 views
0

私はエンティティを使用してMVC3でサイトを、書いています(Postgresのにリンクされているが、一部は関連性があることを確認していない。データのフィルタリングは

ユーザーは「リーグ」の数の一部であり、

このリーグへのアクセス権を持つ他のユーザーがいて、イベントのリストを表示するには、それらの「イベント」のみを表示するリストが必要です。

これが達成できる方法はたくさんありますが、私は最もエレガントで広く受け入れられているものを探しています「正しい方法」であること。

現在、ユーザーとリーグの関係は他のデータと同じ場所に保持されているため、問題なくリーグでフィルタリングできます。私の問題は、フィルタリングを行うためにリポジトリ層内のuserIdを取得するためにHttpContextにアクセスする必要があるかどうかわかりません。

私は上記のことをやっていない場合、私はRoleMembership機能の使用とリーグ、役割の作成を検討していましたし、それを行う機能が組み込まれていました。

質問はMVC3/Entityのユーザーアクセスによる結果データをフィルタリングするためのベストプラクティスですか?私は間違いなく、リポジトリがHttpContextオブジェクトを呼び出すべきであるとは思わない

答えて

1

...

ブログ/チュートリアルのリンクが好ましいが、完全な答えにも受け入れられます。このアプリケーションの依存性注入パターンに従うことをお勧めします。このシナリオには、3つのインタフェースがあります.1つはデータアクセスインタフェース(リポジトリ)です。もう1つは、フィルタリングされたデータのプロバイダのビュー(ビューモデル)です。 3番目はロール情報のプロバイダ(ロールプロバイダ)です。

したがって、リポジトリはスタンドアロンです。ロールプロバイダはHttpContextの依存関係を持っています(あなたの質問から収集します)。ビューモデルはリポジトリとロールプロバイダの両方に依存します。テストを容易にするために、使用する予定のHttpContextメソッドの依存関係ラッピングを記述することを強調したいと思います。

依存性注入とMVCのかなり広範なチュートリアルは、MSDNにあります:http://msdn.microsoft.com/en-us/gg618491

を説明するために:

public interface ILeagueRepository 
{ 
    IEnumerable<League> All; 
} 

public interface ILeaguesProvider 
{ 
    IEnumerable<League> GetUserLeagues(string Username); 
} 

public class LeaguesProvider : ILeaguesProvider 
{ 
    public LeaguesProvider(ILeagueRepository repository) 
    { 
     // ... 
    } 
    public IEnumerable<League> GetUserLeages(string Username) 
    { 
     return _repository.All.Where(league=>league.User == Username); 
    } 
} 

public ActionResult LeaguesController 
{ 
    public LeaguesController(ILeaguesProvider providerDependency, IRoleProvider roleDependency) 
    { 
     IEnumerable<League> leagues = providerDependency.GetUserLeagues(roleDependency.GetCurrentUser()); 
    } 
} 
+0

それは問題ではないので、私は、DIのためNinjectを使用しています。私はまだフィルタが適用されているか分からない...あなたはそれを拡張することはできますか? – Martin

+0

@Martin私は、うまくいけば、意味するものの大まかなスケッチを追加しました。私がしようとしているポイントは、リポジトリにロールの依存関係を混在させないことと、HttpContextに対して直接的にコードするのではなく、定義した依存性に対してコードを書くことです。 – McGarnagle

関連する問題