1

Je reçois un message d'erreur "Référence d'objet non définie sur une instance d'un objet." lorsque j'essaie d'utiliser un référentiel UserRepos. La question est comment puis-je résoudre le référentiel d'utilisateurs au début de l'application (ASP.NET MVC) Qu'est-ce qui ne va pas ici?Comment résoudre un référentiel d'utilisateurs en utilisant Windsor IoC au début de l'application?

public class MyApplication : HttpApplication 
{ 
    public IUserRepository UserRepos; 
    public IWindsorContainer Container; 

    protected void Application_Start() 
    { 
     Container = new WindsorContainer(); 

     // Application services 
     Container.Register(
      Component.For<IUserRepository>().ImplementedBy<UserRepository>() 
     ); 
     UserRepos = Container.Resolve<IUserRepository>(); 
    } 

    private void OnAuthentication(object sender, EventArgs e) 
    { 
     if (Context.User != null) 
     { 
      if (Context.User.Identity.IsAuthenticated) 
      { 
       //Error here "Object reference not set to an instance of an object." 
       var user = UserRepos.GetUserByName(Context.User.Identity.Name); 

       var principal = new MyPrincipal(user); 
       Thread.CurrentPrincipal = Context.User = principal; 
       return; 
      } 
     } 
    } 
} 

Merci de nous aider!

Répondre

4

La cause de cette exception est une mauvaise compréhension du cycle de vie HttpApplication. Ces articles expliquent très bien:

dans votre cas, ce serait l'utilisation du conteneur approprié:

public class MyApplication: HttpApplication { 
    private static IWindsorContainer container; 

    protected void Application_Start()  { 
      container = new WindsorContainer(); 
      ... registrations 
    } 

    private void OnAuthentication(object sender, EventArgs e) { 
     var userRepo = container.Resolve<IUserRepository>(); 
     ... code that uses userRepo 
    } 
} 
+1

Je dois ajouter que le codage OnAuthentication dans le HttpApplication n'est pas tout à fait correct (mais c'est hors de la portée de cette question) –

+0

Merci Mauricio pour votre réponse! Après le débogage, je vois que OnAuthentication a été appelé plusieurs fois pour chaque bande de roulement. Par exemple, si j'utilise des images sur la page, il fera une demande pour chaque image et appellera OnAuthentication? Ai-je raison? Pourriez-vous expliquer pourquoi OnAuthentication ne devrait pas être utilisé dans HttpApplication? J'ai lu des articles et je vois que c'est une solution courante de faire comme ça. Par exemple http://mikehadlow.blogspot.com/2008/03/forms-authentication-with-mvc-framework.html Que conseilleriez-vous? – podeig

+0

@podeig: utilise un HttpModule ou un filtre; ou créez une autre question spécifique sur stackoverflow à ce sujet. –