2017-10-19 16 views
0

Je travaille actuellement avec une application qui utilise Ninject, Log4Net et Nancy.Injecter ILogger avec Ninject, Log4Net et Nancy

Le problème que je rencontre est de déterminer la meilleure façon de conserver la configuration de Log4Net fournie par le Web.config à toutes les instances injectées d'ILogger.

Certains contexte:

Dans cette application, nous construisons un seul ninject StandardKernel, qui charge automatiquement le Log4NetModule fourni par Ninject.Extensions.Logging

classe Notre Nancy Bootstrapper hérite de NinjectNancyBootstrapper en utilisant this project

L'utilisation ci-dessus approche, nous sommes en mesure de résoudre avec succès la propriété suivante:

/// <summary> 
/// Injected Logger 
/// </summary> 
[Inject] 
public ILogger Logger { get; set; } 

Cela dépend d'une configuration Log4Net fournie dans notre Web.config.

Juste avant la création du StandardKernel statique, nous exécutons la XmlConfigurator:

log4net.Config.XmlConfigurator.Configure(); 
_kernel = new StandardKernel(); 

De ma compréhension, ce configurateur devrait seulement besoin d'être appelé une fois dans l'application (qui peut certes être incorrect), avant la création de toutes les instances d'ILogger. Au démarrage de mon application, la première instance de l'ILogger qui est injectée a les appenders contenus que je m'attendais. Chaque appel suivant résout avec succès la dépendance, mais il manque des appenders présents pour la première configuration. Y at-il un comportement prévu ici que le XmlConfigurator s'appliquera seulement au premier ILogger créé? Bien que cela fonctionne certainement dans le cas de l'utilisation d'un seul ILogger pour l'ensemble de l'application, je voudrais au moins un par type. L'une de mes premières tentatives pour résoudre ce problème consistait à attacher le XMLConfigurator à la méthode RequestStartup, mais ajoutait pas mal de temps à nos appels API (doublant presque le temps de réponse).

Peut-être que j'aborde complètement ce problème, mais j'aimerais savoir si quelqu'un a des suggestions et/ou une solution à ce problème.

Merci.

Répondre

1

Vous avez juste besoin d'enregistrer ILogger en tant que service singleton dans Ninject Quelque chose comme ceci:

kernel.Bind<ILogger>.To<LoggerConstructor>().InSingletonScope(); 
+1

C'est une bonne suggestion, mais dans ce cas, j'espérais obtenir une seule instance de l'enregistreur (soit 1 par tapez ou 1 par demande sans encourir la surcharge de chargement XML). J'ai fini par être capable de lancer le chargement XML une seule fois. Il semble que le problème se résumait à un conteneur enfant engendré chaque demande. J'ai ajouté une certaine logique personnalisée pour que mon gestionnaire de requêtes nancy récupère la dépendance de journalisation du conteneur IoC parent et il semble qu'il ait maintenant le comportement souhaité – Miek