2010-11-27 35 views
1

Je charge un module ninject dans mon projet (WCF) et je souhaite connecter log4net dans mon module à l'aide d'un fournisseur personnalisé. La raison pour laquelle j'utilise un fournisseur est que la méthode GetLogger doit passer la classe dans laquelle l'injection a lieu. Si ce n'est pas le moyen de le faire, s'il vous plaît faites le moi savoir, je suis nouveau à Ninject. (Context.getType() n'est pas correct BTW, je vais avoir des ennuis faire.)Exécution de l'injection du constructeur et de l'injection de propriété à l'aide de ninject 2

Le principal problème est que mes variables dans mes cours ilog initialisées après le constructeur a exécuté, mais je veux être capable d'utiliser la journalisation dans mon constructeur. J'utilise aussi Ninject pour appeler mon constructeur et lier ses paramètres à des classes concrètes.

Bind<IBroker>().To<Broker>(); // constructor 
Bind<ILog>().ToProvider(new log4netILogProvider()) // property 
private class log4netILogProvider : Ninject.Activation.Provider<ILog> 
    { 
     protected override ILog CreateInstance(IContext context) 
     { 
      return LogManager.GetLogger(context.getType()); 
     } 
    } 

Toute aide est appréciée.

+0

context.getType() doit être context.Request.Target.Member.ReflectedType btw. – Syg

Répondre

2

Aucun cadre IoC ne pourra jamais effectuer d'injection de propriété avant l'injection du constructeur. Un framework IoC ne peut faire que les mêmes choses que vous pouvez faire dans une usine écrite manuellement. Vous ne pouvez pas accéder à une propriété d'un objet dans une usine avant qu'il a été créé correctement? Donc, ne peut pas le cadre de l'IoC.

Fondamentalement, vous avez deux options.

  1. Do injection constructeur (preféré)
  2. Do injection de méthode et d'exécuter votre code constructeur dans la méthode.

    [Inject] 
    public void Initialize(ILog log) { ... } 
    
+0

mm, a du sens. tnx – Syg

0

Je suggère également une troisième option. Vous pouvez implémenter l'interface IInitializable de Ninject puis voir si vous ne pouvez pas déplacer le code qui repose sur l'injecteur de propriété dans votre implémentation d'Initialize(). Ninject garantit que toute l'injection du constructeur et l'injection de props sont terminées avant l'initialisation d'Initialize.