2017-07-12 2 views
0

Ich benutze Autofac zu DI und MVVM. Ich habe ein globaler Dienst als solche registriert:Autofac Property Injection in bereits registrierten Service

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

Ich bin auch Autofac.Extras.NLog Implementierung für offensichtliche Protokollierung unter Verwendung von:

builder.RegisterModule<NLogModule>(); 

So kann ich die Instanz dieses Dienstes und Logger in jeder bekommen kann Meine ViewModels:

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

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

}}}(...) 

Es funktioniert super. Nun möchte ich Logging-Unterstützung in MyGlobalService. Aber diesmal möchte ich Property Injection anstelle von Constructor Injection verwenden.

Frage ist: sollte ich eine solche Regel anders registrieren?

Beispiel Nutzung:

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: unten beantwortet.

+0

Ihr Code sieht richtig aus. Könnten Sie den Stack-Trace der Ausnahme einschließen? –

+0

@CyrilDurand danke für Ihre Zeit. Ich habe meine Frage bearbeitet, seit ich Immobilien injizieren wollte. Normale Konstruktor Injektion funktioniert gut! – IgorMF

+0

'[External Code]' ist der interessante Teil :) Könntest du mit der rechten Maustaste darauf klicken und "externen Code anzeigen" dann den Beitrag bearbeiten :) –

Antwort

2

Property Injection funktioniert nicht out-of-the-Box, die Sie benötigen Klasse einrichten Sie Eigenschaft Injektion verwenden möchten in, so

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

sollte es tun. Oder Sie können dies manuell unter Verwendung des OnActivating Lebensdauerereignisses tun.

+0

Das ist genau das, was ich gesucht habe. Vielen Dank – IgorMF

Verwandte Themen