2017-07-12 1 views
0

J'utilise Autofac pour DI et MVVM. Je suis un service global enregistré en tant que tel:Injection de propriété Autofac dans un service déjà enregistré

builder.RegisterType<MyGlobalService>().As<IGlobalService>().SingleInstance(); 

Je suis aussi à l'aide Autofac.Extras.NLog mise en œuvre à des fins d'exploitation forestière évidents:

builder.RegisterModule<NLogModule>(); 

cette façon, je peux obtenir l'instance de ce service et enregistreur dans l'un des mes ViewModels:

namespace MyNameSpace.ViewModels 
{ 
    class MyViewModel : BindableBase 
    { 
     readonly IGlobalService _globalService; 
     readonly ILogger _logger; 

     public MyViewModel (IGlobalService globalService, ILogger logger) 
     { 
      _globalService = globalService; 
      _logger = logger; 

}}}(...) 

Cela fonctionne très bien. Maintenant, je également voulez le support de journalisation dans MyGlobalService. Mais cette fois, je voudrais utiliser Property Injection, au lieu de Constructor Injection. Question: est-ce que je devrais enregistrer une telle règle différemment?

Exemple d'utilisation:

namespace MyNameSpace.GlobalServices 
{ 
    class MyGlobalService : IGlobalService 
    { 
     public ILogger Logger { get; set; } 

     public MyGlobalService() 
     {    
      Logger.Debug("My Service Starting...") 
      // no DI happening, getting exception because "Logger" is null 

}}}(...) 

Edit: Questions traitées ci-dessous.

+0

Votre code semble correct. Pourriez-vous inclure la trace de pile de l'exception? –

+0

@ CyrilDurand merci pour votre temps. J'ai édité ma question depuis que je voulais injecter la propriété. L'injection de constructeur normale fonctionne bien! – IgorMF

+0

'[Code externe]' est la partie intéressante :) Pourriez-vous faire un clic droit dessus et "montrer le code externe" puis modifier le poste :) –

Répondre

2

Injection propriété ne fonctionne pas hors-the-box, vous devez configurer la classe que vous souhaitez utiliser l'injection de la propriété, de sorte

builder.RegisterType<MyGlobalService>().As<IGlobalService>().PropertiesAutowired().SingleInstance(); 

devrait faire l'affaire. Ou vous pouvez le faire manuellement en utilisant OnActivating événement de la vie.

+0

C'est exactement ce que je cherchais. Merci – IgorMF