2011-12-29 5 views
1

質問:イベントを使用してこのログコードを構成する簡単な方法はありますか?Loggerを使用したデリゲートとイベントのアーキテクチャ

コードは、@ JonSkeetsの偉大な話(www.tekpub.com)からインスピレーションを得ました。理解のすべての誤りは私のものです。

internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     Person p = new Person(); 
     p.GetDefaultName(); 
    } 
} 

public delegate void LogHandler(string message); 

public class Person 
{ 
    public void GetDefaultName() 
    { 
     LogEventRaiser raiser = SetupLogEventRaiser(); 
     raiser.OnLog("getting default name"); 
    } 

    private static LogEventRaiser SetupLogEventRaiser() 
    { 
     ConsoleLogger cl = new ConsoleLogger(); 
     ConsoleLogger2 cl2 = new ConsoleLogger2(); 

     //when delegate LogHander is called, run fileLogger.Logger method 
     LogHandler handler = cl.Logger; 
     LogHandler handler2 = cl2.Logger; 

     var raiser = new LogEventRaiser(); 
     //wire up event called Log which is of type delegate LogHandler 
     raiser.Log += handler; 
     raiser.Log += handler2; 
     return raiser; 
    } 
} 

public class LogEventRaiser 
{ 
    public event LogHandler Log; 

    public void OnLog(string text) 
    { 
     LogHandler tmp = Log; 
     if (tmp != null) 
      tmp.Invoke(text); 
    } 
} 

public class ConsoleLogger 
{ 
    public void Logger(string s) 
    { 
     Console.WriteLine("ConsoleLogger: " + s); 
    } 

} 

public class ConsoleLogger2 
{ 
    public void Logger(string s) 
    { 
     Console.WriteLine("ConsoleLogger2: " + s); 
    } 
} 
+3

質問は何ですか? – PeeHaa

+1

Jonから多くの影響を受け、実際のqをほとんど忘れてしまったのでしょうか? ;) – Zenwalker

+0

:-)はい私はこの質問では少し曖昧だった(そして午前)。ちょうど私が正しいことについてのアーキテクチャを持っていると感じるようにしようとしています。リファクタリングして簡単にしようとしています。 –

答えて

0

ロギングが必要な情報がない場合、コードについてはあまり言及できません。あらゆる種類の副次的な要件がデザインを変更する可能性があります。

高性能/高スループットが必要な場合は、ログメッセージのキューイングが必要になるため、呼び出されたコードはログアクションでブロックされません。 ログメッセージが実際に投稿されることを確実にする必要がある場合は、フィードバックメカニズムとエラー処理コードの「たくさん」が必要です。 これをパフォーマンスログに使用する場合は、パフォーマンスプロファイラを使用する方が良いかもしれません。

私はKeep It Simpleと言い、そこから行くと思います。

+1

ありがとうCodingBarfield - 私は少しタックを変更し、将来のログへのより簡単なインターフェイスベースのアプローチに行ってきました。あなたが言うように、それを簡単に保つ。待ち行列の良い考え。 http://www.programgood.net/2011/12/28/DelegatesAndEvents.aspx –

1

あなたはNLog(http://nlog-project.org/)のようなロギングフレームワークを考えましたか?

ログとターゲットを分けることができます。ターゲットをハードコードする必要はありません。また、ロギングレベルが無効であれば、ロギングレベルとCPU負荷が低いという利点があります。

+0

おかげでロブ - はい私は前にNLogを使用して、それがたくさん好きだった。 –

関連する問題