次の機能を備えた「TODO リスト」Web アプリケーションを作成しているとします。
- ユーザーを登録/ログインする機能を持っている
- 各ユーザーは、他のユーザーから独立した独自の TODO リストを持っています
そこで、クラス ToDoItem を持つ単純なモデルを作成しました。
良い方法を使用したいので、データベースから TODO アイテムを取得する汎用リポジトリを作成しました。
public interface IRepository<T>
{
IQueryable<T> FindAll();
IQueryable<T> Find(Expression<Func<T, bool>> predicate);
void Add(T newEntity);
void Remove(T entity);
T FindById(long id);
}
(実装は EF とコード ファーストのアプローチで行われますが、現時点では重要ではありません)
このリポジトリは、ユーザーが TODO アイテムを一覧表示、追加、削除、編集できるようにするコントローラーに挿入されます。これは、Ninject DI コンテナーを使用して具体的な実装へのリポジトリ インターフェイスを解決する、私が作成したカスタム コントローラー ファクトリを介して行われます。したがって、コントローラーは次のようになります。
public class HomeController : Controller
{
IRepository<ToDoItem> _repository;
public HomeController(IRepository<ToDoItem> repository)
{
_repository = repository;
}
// list all TODO items for this user
[Authorize]
public ActionResult ListItems()
{
var todoItems = _repository.FindAll();
return View(todoItems);
}
}
私の質問は、現在ログインしているユーザーに対してのみコントローラーが TODO リストを返すようにするための最良の方法は何ですか? 理想的には、現在ログインしているユーザーで注入および事前設定されたリポジトリでコントローラーを動作させたいと考えています。言い換えれば、アクションメソッドでこの種のコードを避けたいと思います:
// list all TODO items for this user
[Authorize]
public ActionResult ListItems()
{
var todoItems = _repository.FindAll(User.Identity);
return View(todoItems);
}
可能な解決策は、どのユーザーがログに記録されているかをコントローラーファクトリーに何らかの方法で認識させて、具体的なリポジトリを初期化し、ユーザー ID を設定して、コントローラーがすべてのアクションメソッドでそれを行う必要がないようにすることだと考えていました。これは良いアプローチでしょうか?もしそうなら、どうすれば実装できますか? そうでない場合、より良い代替手段は何ですか?