2017-02-08 7 views
0

私のアプリのすべてのクラスで使用されるユーティリティ(例えば、ロガー)があるとします。 Loggerを使用するクライアントタイプに関する情報を保存できるようにします。つまり、StockProviderがメッセージを記録する場合、ログメッセージにはログメッセージと共にStockProviderクラス名を追加する必要があります。そしてStockProviderので、それはその方法でロガーを使用することができますクライアントに関する情報を依存関係に渡す

public StockProvider (ILogger logger) {} 

のようにコンストラクタを介して渡されたロガーを持っています。 logger.Log (GetType(), msg)のように、ロガーが使用されるたびに型情報が渡されるのが最も簡単です。私が望むのは、loggerメソッドにその型情報を渡さずに、そのクライアント型情報をその状態にして、Logを呼び出すとメッセージに型名が追加されるということです。例えば。

class Logger : ILogger { 
    public Logger (Type clientType) { 
     this.type = clientType; 
    } 
    public void Log(string msg) 
    { Console.WriteLine(this.type.FullName + msg); } 
} 

のようなコンストラクタでそれを渡すとStockProviderの内側のように働くだろう、私はちょうどそこで質問がある

logger.Log (msg) 

を言うことができる:私はそれを受け取るよう一般的な方法でLoggerを登録することができていますクライアントのclientTypeStockProviderか他のクライアントタイプのどちらであるかをログに記録しますか? ロガーはコード内で広く使用されているクラスの例として使用されています。

public interface ILogger<T> where T: class 
    { 
     void Log(string message, LogLevel level); 
    } 

    public class Logger<T> : ILogger<T> 
     where T: class 
    { 
     public void Log(string message, LogLevel level) 
     { 
      WriteLog(typeof(T).Name + ": " + message, level); 
     } 
    } 

そして今、あなたはあなたの中に​​の一般的な実装を登録する必要があります。それはまた、あなたが好きな汎用的なロガーを作成することができますイベント

答えて

2

をトリガー誰知りたいでしょうイベント発行の一種であるかもしれませんDIコンテナ、UnityContainerで例えば、あなたはそれを行うことができます。

IUnituContainer container = new UnityContainer()' 
    container.RegisterType(typeof(ILogger<>), typeof(Logger<>)); 

次プロバイダがどのように見える必要がありますlog4netのを使用して10

+0

クール。実際に私はそのようなアプローチについて考えましたが、タイプパラメータなしで逃げることができるかどうか疑問に思っていました。それが問題の全体のポイントです。とにかく、提案のおかげで - きちんとした解決策! – patryk

0

は、あなたはこのような何かを行うことができます:それは明らかなように私の場合インポートに

public class Import 
{ 
    private static ILog Log 
    { 
     get 
     { 
      if (LogManager.GetCurrentLoggers().Length == 0) 
      { 
       // load logger config with XmlConfigurator 
       log4net.Config.XmlConfigurator.Configure(); 
      } 
      return LogManager.GetLogger(typeof(Import)); 
     } 
    } 

は私のクラスの名前です。必要に応じてこのコードを変更する必要があります。

+0

正直なところ、広く使われている実装の例としてロギングを使用しました。誰がイベントを公開しているかについての情報を必要とする、ある種のイベント公開コードでもあります。問題はDIの登録と解決のコンセプトに関するものです – patryk