2017-07-12 9 views
0

DIとMVVMにAutofacを使用しています。私は、世界的なサービスは、このようなとして登録されている:私は、のいずれかでそのサービスとロガーのインスタンスを取得することができますAutofacプロパティ既に登録されているサービスでの注入

builder.RegisterModule<NLogModule>(); 

この方法:

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

は、私はまた、明白なログ記録の目的のためにAutofac.Extras.NLog実装を使用しています私のViewModels:

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

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

}}}(...) 

素晴らしいです。 今すぐ私は MyGlobalService内のログのサポートをしたい。しかし今回は、Constructor Injectionの代わりにProperty Injectionを使いたいと思います。

質問:このようなルールを違う方法で登録する必要がありますか?

使用例:

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 

}}}(...) 

編集:以下答えました。 、あなたはあなたがプロパティインジェクションを使用するクラスを設定する必要がアウトオブボックス

+0

あなたのコードは正しく見えます。例外のスタックトレースを含めることができますか? –

+0

@CyrilDurandお時間をいただきありがとうございます。私はプロパティを注入したいので、私は私の質問を編集しました。通常のコンストラクタインジェクションは正常に動作しています! – IgorMF

+0

'[外部コード]'は興味深い部分です:)あなたはそれを右クリックして "外部コードを表示"して投稿を編集できます:) –

答えて

2

プロパティインジェクションはそう

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

はトリックを行う必要があり、動作しません。または、生涯イベントOnActivatingを使用して手動で行うこともできます。

+0

これはまさに私が探していたものです。ありがとう – IgorMF

関連する問題