2016-10-12 8 views
1

私は依存性注入について学び始め、自分自身の(簡単な)ロギングファサードを紹介することにしました。これまでのところ、Ninjectを使ってNLogとlog4netの基本的な機能を扱うロギングファサードがあります。 (私はNinjectが独自のロギングファサードを持っていることを知っていますが、これは学習の練習です)Ninjectはフォーム作成後にwinformに挿入しますか?

しかし、私は問題に遭遇しました。私がやりたいことは、私がRichTextBox(winformsを使ってIm)にファイルに記録するものを複製することです。私はこれをNLogとlog4netを使って直接行うことができます。私が持っている問題は、Ninjectがインターフェイス上でワイヤを張ったときに、winformのrichtextboxが作成され、結果としてロガーがrichtextboxを見つけないうちにロガーの実装を作成するということです。

私がする必要があると思うのは、フォームを作成してから、Ninjectでロガーを作成してフォームに挿入することですが、これをどうするかわかりません。私は完全に間違った方法でこれを見ているかもしれませんが?

一緒にこれを結びつけるために使用してコードイムは以下を参照してください:

static class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     IKernel kernel = new StandardKernel(new DI.NLog.Logger()); 
     var form = kernel.Get<Form1>(); 
     Application.Run(form); 
    } 
} 

とロガーが注入された場合、私のフォームのコンストラクタです。

public Form1(ILog log)   
{ 
    InitializeComponent();    
    _log = log; 
} 

すべてのヘルプやアドバイスをいただければ幸いです。

まず、フォームクラスがILogを実装します はここ

答えて

0

はこれについて考えるための一つの方法です、ありがとうございました。これが意味するのは、それ自身がロギング先であるということです。フォーム上でロギングメソッドが呼び出されると、RichTextBoxコントロールに書き込む必要があるものを書き込みます。

今、フォーム自体はILogであり、ILogにも依存します。また、別のILog宛先(たとえば、Log4netアダプタ)にログインしたいと考えています。

Object Graph

XからYへの矢印はYがXの

CompositeLogsはクラスの中に注入されていることをXがYに依存していることを意味し、あるいは:ここ

は、私はオブジェクトグラフを想像する方法ですcompositeILogであり、それは複数のILogオブジェクトに依存し、何かを記録するために呼び出されると、そのような要求をすべてのILog依存関係にブロードキャストします。

グラフから分かるように、循環依存性があります。これは、Property Injectionを使用することで解決できます。

私たちは、このようCompositeLogsはクラス内のプロパティインジェクションを使用することができます。このクラスは、建設上の任意の依存関係を取らないことを

public class CompositeLog : ILog 
{ 
    private ILog[] logs; 

    public ILog[] Logs 
    { 
     set 
     { 
      if(logs != null) 
       throw new Exception("The logs dependencies has been set before"); 

      logs = value; 
     } 
    } 

    public void LogInformation(string message) 
    { 
     foreach(var log in logs) 
      log.LogInformation(message); 
    } 

    //Other methods here 
    //... 
} 

は注意してください。後でその依存関係をLogsプロパティを介して注入することができます。

あなたがPure DIを使用している場合は、あなたのComposition Rootは次のようになります。

var compositeLog = new CompositeLog(); 

Form1 form = new Form1(compositeLog); 

compositeLog.Logs = new ILog[]{ form , new Log4NetAdapter()}; 

これは簡単にNInjectで行うことができるかどうか私は知りません。バインディングはおそらく複雑になるでしょう。そのような場合、there are multiple implementations of a single interface, I think that DI containers fail。純粋なDIを使うことをお勧めします。

+0

あなたの答えをありがとうYacoub、私はあなたがこの特定の問題のために、純粋なDIに後退する方が簡単かもしれないと思いますが、特に満足できるものは見つけられません。それが他の人にとって興味があれば、私が探していたのと同じ結果を得るための回避策を見つけ出しました:コンソールにログを記録し、出力をrichtextboxに再ルーティングするためのロガーを作成しました – Reznoir

関連する問題