2016-03-29 15 views
1

Ich habe 3 verschiedene Anwendungen. Ich habe log4net in einer gemeinsamen Bibliothek, die unter 3 Anwendungen geteilt werden. Ist es eine schlechte Übung, denselben Logger für alle 3 Dienste zu verwenden? ich geschrieben habe so etwas wie dieseIst es schlecht, denselben Logger für verschiedene Anwendungen zu verwenden

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); 
     } 
} 

und in meiner Anwendung 1 app_start Ich injecte wie diese

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

Und ich in meinem Code verwende wie

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

Auch ich eine Von den Negativen, die ich mit diesem Ansatz denke, habe ich log4net in allen meinen 3 Anwendungen installiert. Also frage ich mich, ob ich etwas falsch mache oder gibt es einen besseren Ansatz?

Antwort

0

Es ist eine gute Entscheidung, wenn Sie lose Kopplung von Log4net. Dann können Sie Ihrem Logger ein anderes Projekt zuweisen und für alle Anwendungen freigeben. Wenn Sie wollen und brauchen, können Sie die Implementation aus Middleware-Projekten verstecken (Dienste, dal vs ..). Sie können Interface und Implementierung in verschiedene Projekte unterteilen.

Dann wissen Ihre Middleware-Klassen nur über Schnittstelle und Sie können die Implementierung von Logger ändern, ohne diese Dienste neu zu erstellen oder erneut bereitzustellen (lose Abhängigkeit).

Sie können jedoch Ihre Treiberprojekte (Hauptprojekte) nicht ohne Implementierung ausführen, sie müssen die Implementierung von Log4Net (oder einer anderen Bibliothek, die dieselbe Schnittstelle verwendet) kennen.

Zum Lösen der Kopplung: Ihre Dienste sollten Ihre Schnittstelle nicht verwenden log4net.ILog.

Ich habe keine Erfahrung mit log4net. Aber here, sie verwendeten Fabrik für log4net. Das ist gut, Ihre Dienste werden Ihre Fabrik nicht Log4Net kennen und Ihre Fabrik wird davon wissen (Log4Net).

-Code auf den Link:

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

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

Aber ich sage es noch einmal kann man nicht lose Kopplung auf oberster Ebene (Fahrer) Projekte, weil sie alle implematations wissen müssen sonst können sie nicht spritzen.

+0

Ja, ich hatte das im Sinn, aber um die Protokollierungsstufe auf Write-Methode anzugeben, sollte die aufrufende Anwendung log4net haben – Vivekh

Verwandte Themen