2016-03-29 14 views
1

私は3種類のアプリケーションを持っています。私は3つのアプリケーションの間で共有される共有ライブラリにlog4netを持っています。 3つのすべてのサービスに同じロガーを使用することは悪い習慣ですか? 私は私がこの異なるアプリケーションに同じロガーを使用するのは悪いですか

myContainer.RegisterType<ILog> 
         (
          new ContainerControlledLifetimeManager(), 
          new InjectionFactory(x => LogManager.GetLogger("Application 1")) 
         ); 

のように注入していますそして、私のコードで私も

_logger = myContainer.Resolve<log4net.ILog>(); 
Log4netLogger logMessage= new Log4netLogger(_logger); 
logMessage.Write 
      (
       log4net.Core.Level.Info, 
       logMessage 
      ); 

私のような使用しています。この

public class Log4netLogger 
{ 
     private ILog _logger = null; 
     public Log4netLogger(ILog logger) 
     { 
      _logger = logger; 
     } 



     public void write(Level logLevel, string message) 
     { 
      _logger.Logger.Log(_logger.GetType(),logLevel,message,null); 
     } 
} 

のように、私のアプリケーションの1 app_startで何か書かれていますこのアプローチでは、3つのアプリケーションすべてにlog4netをインストールしていると思います。だから私は何か間違っているのか、もっと良いアプローチがあるのだろうかと思っています。

答えて

0

ルースカップリングLog4netです。次に、ロガーを別のプロジェクトにして、すべてのアプリケーションで共有することができます。必要に応じて、ミドルウェアプロジェクト(サービス、dal vs ..)から実装を隠すことができれば、別のプロジェクトにインターフェイスと実装を分けることができます。

あなたのミドルウェアクラスはインターフェイスについて知っているだけで、このサービスを再構築したり再配置したりすることなく、ロガーの実装を変更することができます(緩い依存関係)。

しかし、実装していないドライバプロジェクト(メインプロジェクト)を実行することはできません。Log4Net(または同じインタフェースを使用する別のライブラリ)の実装を知る必要があります。

カップリングが緩んでいる場合:サービスではなく、log4net.ILogのインターフェイスを使用する必要があります。

私はlog4netについて経験はありません。しかしhere、彼らはlog4netのために工場を使いました。これは良いことです、あなたのサービスはあなたの工場がLog4Netではないことを知り、あなたの工場は(Log4Net)について知っています。リンク上

コード:

public interface ILoggerFactory 
{ 
    ILogger Create(Type type); 
} 

public class LoggerFactory : ILoggerFactory 
{ 
    public ILogger Create(Type type) 
    { 
     return new Log4netLogger(type); 
    } 
} 

しかし、彼らはそれ以外の場合は、注入することはできませんすべてのimplematationsを知っている必要がありますので、私はあなたがトップレベル(ドライバ)のプロジェクトに疎結合することはできませんもう一度言います。

+0

ええ、私は念頭に置いていましたが、書き込みメソッドにログレベルを指定するには、呼び出し元アプリケーションにlog4net – Vivekh

関連する問題