ASP.NET MVC4 repository injection to controller that depends on currently logged user -


let's creating "todo list" web application following features:

  • have ability register/login users
  • each user has it's own todo list independent other users

so i've created simple model has class todoitem.

i'd use practices created generic repository should fetch todo items database:

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

(implementation done ef , code-first approach that's not important right now)

this repository injected controller allows user list, add, remove, edit todo items. done via custom controller factory i've created uses ninject di container resolve repository interface concrete implementation. controller looks this:

public class homecontroller : controller {     irepository<todoitem> _repository;     public homecontroller(irepository<todoitem> repository)     {         _repository = repository;     }      // list todo items user     [authorize]     public actionresult listitems()     {         var todoitems = _repository.findall();         return view(todoitems);     }  } 

my question best way make controller return todo list logged in user? ideally i'd have controller work repository injected , pre-set logged user. in other words i'd avoid kind of code in action method:

    // list todo items user     [authorize]     public actionresult listitems()     {         var todoitems = _repository.findall(user.identity);         return view(todoitems);     } 

i thinking possible solution make controller factory somehow know user logged initialize concrete repository , set user id controller doesn't have in every action method. approach , if how can implement it? if not, better alternatives?

i tackle in 1 of 2 ways:

1. make lifestyle of repository per web request , take dependency on user.identity such can used inside of repository methods. e.g.

public class repository<todoitem> : irepository<todoitem> {     private iidentity _identity;      // let container inject iidentity repository     // (you need register service      //  container iidentity this)     public repository(iidentity identity)     {         _identity = identity;     }      iqueryable<todoitem> findall()     {         return fromsomecontext().where(x => x.username == _identity.name);     }      // .... } 

then register method ninject can call resolve iidentity component requires it. (you may decide injecting iprincipal more useful can information user roles too).

kernel.bind<iidentity>()       .tomethod(ctx => httpcontext.current.user.identity)       .inrequestscope(); 

now, assuming ninject constructing controllers , have registered components irepository<t> services application requires, current user iidentity injected repository<todoitem> ninject.

2. create extension method irepository<todoitem> (or irepository<t> if appropriate) wraps adding where() expression limiting returned todo items relevant current user.


Comments

Popular posts from this blog

linux - xterm copying to CLIPBOARD using copy-selection causes automatic updating of CLIPBOARD upon mouse selection -

c++ - qgraphicsview horizontal scrolling always has a vertical delta -