2012-04-24 23 views
0
class LogUtil<T> : ILogUtility 
{ 
    log4net.ILog log; 

    public LogUtil() 
    { 
     log = log4net.LogManager.GetLogger(typeof(T).FullName); 
    } 

    public void Log(LogType logtype, string message) 
    { 
     Console.WriteLine("logging coming from class {0} - message {1} " , typeof(T).FullName, message); 
    } 
} 

public class Logger 
{ 
    ILogUtility _logutility; 

    public Logger(ILogUtility logutility) 
    { 
     _logutility = logutility; 
    } 


    public void Log(LogType logtype, string message) 
    { 
     _logutility.Log(logtype, message); 
    } 


} 

私は柔軟性があり、今後LogUtilクラスを削除して他のものを使用する機能が必要です。あまりにも多くのラッパークラス

次のようにだから私はLoggerUtilityラッパークラスを記述します。

class LoggerUtility<T> 
{ 

    Logger logger; 
    public LoggerUtility() 
    { 
     LogUtil<T> logutil = new LogUtil<T>(); 

     logger = new Logger(logutil); 

    } 

    public void Log(LogType logtype, string message) 
    { 
     logger.Log(logtype, message); 
    } 

} 

私のクライアントコードを次のように

public class TestCode 
{ 
    public void test() 
    { 

     new LoggerUtility<TestCode>().Log(LogType.Info, "hello world"); 

    } 

} 

をLogUtilからの疎結合を取得するには、私は2つのラッパークラスLoggerとLoggerUtilityを書き終わります。ですから、将来ILOGUtilityに別のメソッド を追加する必要がある場合は、そのメソッドをLoggerクラスに追加してからLoggerUtilityを追加する必要があります。

次のように私は、クライアントのコードを書くことができるようにLoggerUtilityを書くための最良の方法は何ですか:

私に知らせてください。

おかげ

+0

ログインフラストラクチャを頻繁に変更している頻度は?これはあまりにも多いようです – BrokenGlass

+0

しかし、私はまだ柔軟性を持っていると思うでしょう –

答えて

2

実際には1つにする必要はないレベルの抽象化を追加するようなものです。

最終結果から始めれば、LoggerUtilityはLogTypeパラメータに基づいて物事を記録するために使用できるインターフェイスを持つだけで済みます。

あなたのLoggerクラスは、現在書かれているように、ILogUtilityインターフェイスの周りの薄いラッパーです。それで、なぜそのレイヤーを追加するのを悩ませますかLoggerクラスでILogUtilityインスタンスを直接使用できないのはなぜですか?さらに一歩進んで、インターフェイスをILogUtility<T>と定義し、LoggerUtility<Foo>を作成するときに使用するロガーのインスタンスはFooクラスに基づいていることがわかります。

しかし、正直言って、私はあなたがここでホイールを改革しているかもしれないと思います。 Common Logging for .NETをご覧ください。おそらくあなたがやろうとしていることが楽になり、長期的にはより意味をなさないでしょう。

0

あなたは第二のラッパーを必要としない、あなたは、工場やlog4netの周りに適切なラッパーを構築するために、依存性注入フレームワークを使用するのいずれかが必要です。

Ninjectを使用して、あなたのインターフェイスを変更するには、

kernel.Bind(typeof(ILogUtility<>)).To(typeof(Log4NetUtil<>); 

を行うと、

/クラスロガーのインタフェースである
var logger = kernel.Get<ILogUtility<MyClass>>(); 

としてそれをインスタンス化することができます:それは見え

public interface ILogUtility<T> where T : class 
{ 
    void Log(LogType logtype, string message); 
} 

public class Log4NetUtil<T> : ILogUtility<T> where T : class 
{ 
    log4net.ILog log; 

    public LogUtil() 
    { 
     log = log4net.LogManager.GetLogger(typeof(T).FullName); 
    } 

    public void Log(LogType logtype, string message) 
    { 
     Console.WriteLine("logging coming from class {0} - message {1} " , typeof(T).FullName, message); 
    } 
} 
+0

ロガークラスは私が依存性注入フレームワークを得るのを助けます –

+0

@ dotnet-practitioner:それは本当に理にかなっていません。 DIフレームワークを設定するコードがロガーに書き込むことを意味しますか?その場合、その特定のコードはインスタンスを直接作成できます。それ以外の場合は、ロガーを注入する必要があります。 – StriplingWarrior

+0

@ dotnet-practitioner - Ninjectのサンプルを更新しました。 – tvanfosson

関連する問題