2016-07-13 9 views
1

カスタムファクトリメソッドを使用して、Unityで解決タイプの親を取得することは可能ですか?私はいくつかのコンテキストがすでに親オブジェクトに関してそれに適用されているロガーを構築しようとしています。UnityのカスタムInjectionFactoryから現在ビルドオブジェクトを取得する

// ... other types being registered 
container.RegisterType<ILogger>(new InjectionFactory(ResolveLogger)); 

// Custom factory method 
private ILogger ResolveLogger(IUnityContainer container) 
{ 
    // I want to know the type of the parent that requires the ILogger interface so that I can add it to my logging context (with Serilog): 
    Type parentType = ??? 
    return Log.Logger.ForContext(parentType); 
} 

私はクラスのインスタンスを作成すると、Serilogは私がこのようにロガーのためのコンテキストを設定することができます:その後

public class MyService 
{ 
    private readonly ILogger logger; 
    public MyService(ILogger logger) 
    { 
     this.logger = logger.ForContext(this.GetType()); 
    } 
} 

this.logger.Information("Hello World")への呼び出しのすべてが、追加のメタデータが含まれますMyServiceクラスで呼び出されたことを示しています。

私はUnityを仕事に使うことによってロガーを消費するすべてのクラスでlogger.ForContext(this.GetType())を呼び出すことを忘れないようにしようとしていました。

+1

最終目標が何であるかを説明してください。多分もっと良い解決策があるかもしれません。 – Michael

+0

質問を私の具体的な目標に更新しました。 –

+0

Unityがその情報を提供しているかどうかわかりません。カスタムリゾルバまたはカスタムポリシーやカスタムビルドを調べることができます。しかし、私はLog4Netがあなたが望むことをしていると思います。 – Michael

答えて

1

カスタムポリシーがあなたの後ろのものを手に入れるとは思わない。私はあなたに "親"タイプの可視性を与えるフックさえあるのか分からない。私は間違っている可能性がある。しかし、ここでは代替の解決策と私が使用するものがあります。

呼び出しタイプを取得するためにジェネリックを使用することができます(前述のForContextと似ていますが、もう少しエレガントです)。 [CallerMemberName]を使用すると、呼び出し元の名前(メソッド名、プロパティ名など)を取得できます。


このよう

...

public interface ILogger<T> 
{ 
    void Write(string message, [CallerMemberName] string callingMethod = ""); 
} 

と団結の登録は、このようなオープンジェネリックを使用することでしょう...

container.RegisterType(typeof(ILogger<>), typeof(ConsoleLogger<>)); 

そして、ここでは一例です使用方法...

public class MyService 
{ 
    public MyService(ILogger<MyFileService> logger) 
    { 
     // Check for nulls, set to member variable, etc. 
    } 
} 

しかし、静的な型は一般的な引数として使用することはできないとして、これは(私は静的な型を回避しようとするので、これは私のための問題の多くはされていない)静的な型では動作しないことに注意してください。

私は例hereを嘲笑しました。

関連する問題