2011-02-01 9 views
4

私は今混乱しており、実際の問題を理解していない可能性があります。モチーフ/リアルロガーインスタンスを作成するためにユニティコンテナを設定する方法

私は、エラーデータを記録するためにロガーインスタンスを必要とするオブジェクトを持っています。

は例

public class CommonFileSaver : IFileSaver 
    { 
      private static ILog _log = LogManager.GetLogger(); 

      ..... 
    } 

のために私はロギングプロセスをテストしたいです。そして私の現在の決定は、ILogインターフェースのモックを使うことです。

この時点で、Unityを使用して依存関係を解決することに決めました。

だから、ライン

ILog _log = LogManager.GetLogger(); 

は質問がセットアップにユニティコンテナはLogManagerのファクトリを使用して私にアイログオブジェクトの新しいインスタンスを返す方法です

ILog _log = Resolver.Instance.Resolve<ILoger>(); 

ようになります。

ありがとうございます。

P.S. ILogはlog4netインターフェイスです。ログ全体はlog4netを使って実装されています。

答えて

1

ここで問題となるのは、ハリウッドの原則に従わないということです。静的なファクトリメソッドとシングルトンは、依存性注入にはうまく適合しません。あなたのアイログ工場を注入するために、あなたのコードを変更する必要があります。

public class CommonFileSaver : IFileSaver 
{ 
    public CommonFileSaver(ILogFactory logFactory) 
    { 
     _log = logFactory.GetLogger(); 
    } 

    private readonly ILog _log; 

    ..... 
} 
+0

これは適切な解決策のようです。ありがとうございます。 – v00d00

1

log4netのラッパーを書くことができます(とにかく良いアイデアです)。ラッパーは、log4netファクトリメソッドを使用してインスタンスを作成し、 "Configure"メソッドが呼び出されたことを確認します。

ラッパーを書く場合は、これを考慮するとよいでしょう。information

1

私はあなたにもLogManagerを模擬し、模擬のILogを返すようにGetLoggerに期待を設定することを示唆しているとき、あなたが達成しようとしているものの目標は、モックのILogでロギングプロセスをテストする場合。

+0

は素晴らしいコメントありがとうございました。 – v00d00

2

は多分それがデザインに正しいではなく、工場を使用すると、ユニティで可能です...

_container = new UnityContainer(); 
_container.RegisterType<ILog>(new InjectionFactory(c => LogManager.GetLogger())); 
+0

私のために十分に良いだろう:) –

関連する問題