2009-10-07 19 views
0

J'utilise Ninject pour DI dans mon application asp.net, donc ma classe Global hérite de NinjectHttpApplication.Utilisation du Logger NLogModule Ninject dans global.asax

Dans mon CreateKernel(), je crée mes modules personnalisés et DI fonctionne correctement pour moi.

Cependant, je remarque qu'il existe une propriété Logger dans la classe NinjectHttpApplication, donc j'essaie d'utiliser ceci dans Application_Error lorsqu'une exception n'est pas interceptée.

Je pense que je crée correctement le module nlog pour Ninject, mais mon enregistreur est toujours nul. Voici mon CreateKernel:

protected override Ninject.Core.IKernel CreateKernel() 
{ 
    IKernel kernel = new StandardKernel(new NLogModule(), new NinjectRepositoryModule()); 
    return kernel; 
} 

Mais dans la méthode suivante, Logger est toujours null.

protected void Application_Error(object sender, EventArgs e) 
{ 
    Exception lastException = Server.GetLastError().GetBaseException(); 
    Logger.Error(lastException, "An exception was caught in Global.asax"); 
} 

Pour clarifier, Logger est une propriété sur NinjectHttpApplication de type ILogger et a l'attribut [Injecter]

Toute idée comment injecter correctement dans l'enregistreur?

+0

Ne devriez-vous pas surcharger Load() au lieu de CreateKernel()? –

Répondre

0

Etes-vous en train de câbler un ILogger dans votre NLogModule? Si ce n'est pas le cas, Ninject ne saura probablement pas quoi utiliser lorsque vous utiliserez le Logger de votre classe NinjectHttpApplication implémentée.

Je voudrais vérifier ce qui est dans votre NLogModule, et je suggère également de le mettre dans votre question. Je pense que cela pourrait nous aider à résoudre votre problème.

+0

NLogModule n'est pas ma classe, c'est celui que j'ai téléchargé avec Ninject et il est de type Ninject.Integration.NLog.Infrastructure.NLogModule Quand je le démonte avec Reflector, on dirait qu'il fait l'affaire en utilisant LogManager.GetLogger –

+0

@ Ciaran C'est intéressant. Je suis prêt quelque part que vous devez spécifier quel ILogger vous voulez utiliser car il peut y avoir un certain nombre de logs différents (NLog, Log4net juste pour en nommer un couple). Je ne suis pas sûr s'il existe un ensemble par défaut, mais si vous revenez en arrière, cela semble indiquer qu'il n'y a pas de valeur par défaut. Je voudrais jouer avec l'enregistrement explicite d'un certain type de ILogger et voir si cela aide. – Joseph

+0

Dans mon propre module, j'ai essayé de lier l'ILogger en utilisant: Bind () .Pour () .Utilisation de (); mais ne fonctionne toujours pas. Il suffit de créer un enregistreur NLog comme d'habitude - ça ne devrait pas être si difficile! –

1

Download la dernière version de GitHub. La journalisation a été supprimée. La raison pour laquelle le logger n'est pas injecté est que Ninject ne crée pas la classe HttpApplication, donc il ne sait pas l'injecter, vous devez l'assigner manuellement. Ninject ne peut initialiser que les composants activés par le noyau.