Ho una classe di autorizzazione personalizzata che eredita da FilterAttribute e implementa IAuthorizationFilter. Sto usando l'ultima versione del supporto di Ninject w/asp.net MVC 3.Autorizzazione personalizzata MVC 3 e Ninject IoC
Il problema che ho è che sto usando il constructor injection per iniettare un repository. Ma dal momento in cui viene chiamato OnAuthorization, il repository è nullo. Ecco il codice ...
public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
private readonly IMyRepo _MyRepo;
public MyAuthorizeAttribute() { }
public MyAuthorizeAttribute(IMyRepo myRepo)
{
_MyRepo= myRepo; //this gets initialized
}
public void OnAuthorization(AuthorizationContext filterContext)
{
_MyRepo.DoStuff(); //<< Null, wtf
}
}
Filtro Binding:
Bind<IMyRepo>().To<MyRepo>().InRequestScope();
this.BindFilter<MyAuthorizeAttribute >(System.Web.Mvc.FilterScope.Controller, null).WhenControllerHas<MyAuthorizeAttribute >();
Aggiornamento: Una cosa che ho notato è questo filtro è a livello dei controllori. Ho altri filtri a portata di azione che sembrano funzionare correttamente ... potrebbe essere questa la ragione?
Aggiornamento 2: ho confermato che se cambio il campo di applicazione del filtro all'azione, allora il repository è disponibile OnAuthorization (non nullo).
Questo funziona di seguito, tuttavia è necessario per l'ambito del controller, non per l'azione.
this.BindFilter<MyAuthorizeAttribute >(System.Web.Mvc.FilterScope.Action, null).WhenActionMethodHas<MyAuthorizeAttribute >();
Sembra che il tuo MyAuthorizeAttribute venga chiamato con il costruttore predefinito. – dexter
@dexter, non pensare che sia il caso. Ho inserito breakpoint e ctor con il repository è chiamato –
Hai impostato il binding del filtro nel modulo Ninject. Guarda il codice di esempio nella sezione "Iniezione delle dipendenze per filtri" in http://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/#more-2004 – WorldIsRound