2016-07-21 1 views
0

私は2つのインターフェイス​​とILogger<T>を持っています。後者は前者から継承しています。そして、いくつかのようなクラスHandler汎用オブジェクトを非ジェネリックパラメータとして使用するオートファック

public class Handler 
{ 
    public Handler(ILogger logger) 
    { 
    } 
} 

と私は解決しILogger<T>の代わりに、​​に渡すAutofacをお伝えしたいと思います。​​とILogger<T>の両方のインスタンスを解決できると仮定して、ここでは問題はありません。

私は私がやってインスタンスを渡すことができます知っている:

builder.RegisterType<Handler>() 
     .AsSelf() // assume any other suplerfluos config is also done 
     .WithParameter(...); 

あり3つの過負荷(少なくともAutofacの私のバージョンの)が、それらのすべての3が何とかパラメータとしてインスタンスを使用して暗示します。これを行うにはいくつかの方法があります.WithParameter(typeOf(ILogger<Handler>))

私のような何かをしたいですか?

+0

これは実行時にどのように動作すると思いますか?あなたは確かにコンパイルするようなものを書くことはできませんでしたが、なぜランタイムが何か異なった振る舞いをすると期待していましたか? –

+0

ハンドラーインスタンスを手動で作成する場合、 'var handler = new Handler(new DefaultLogger ()); 'を実行しても問題ありません。私はハンドファラーを頼むときはいつでも、私のためにオートファックをする方法があると思った。 – Luiso

+0

'ILogger'を' DefaultLogger () 'にマップするのはなぜですか?または、 'Handler2'に注入する必要がある' ILogger'に対して、 'DefaultLogger ()'でしょうか? –

答えて

1

これは、登録イベントを使用して行うことができます。 LoggerFactory.GetLoggerForClass()は、本質的にILogger<T>のインスタンスを作成します

/// <summary> 
/// DI registrations for loggers. 
/// </summary> 
public class LoggersModule : IModule 
{ 
    public void Configure(IComponentRegistry componentRegistry) 
    { 
     componentRegistry.Registered += (sender, e) => 
           e.ComponentRegistration.Preparing += OnComponentPreparing; 
    } 

    private static void OnComponentPreparing(object sender, PreparingEventArgs e) 
    { 
     var t = e.Component.Activator.LimitType; 
     e.Parameters = e.Parameters.Union(new[] 
     { 
      new ResolvedParameter(
               (p, i) => p.ParameterType == typeof(ILogger), 
               (p, i) => LoggerFactory.GetLoggerForClass(t)) 
     }); 
    } 
} 

関連する問題