2017-02-08 1 views
0

내 응용 프로그램의 모든 클래스에서 사용할 수있는 유틸리티 (예 : 로거)가 있다고 가정합니다. 로거가 로거를 사용하는 클라이언트 유형에 대한 정보를 저장할 수있게하려면 StockProvider에 메시지를 기록하려면 로거가 로그 메시지와 함께 StockProvider 클래스 이름을 추가해야합니다. 그리고 StockProvider 그래서 그것의 방법에 로거를 사용할 수 있습니다클라이언트에 대한 정보를 종속성에 전달

public StockProvider (ILogger logger) {} 

같은 생성자를 통해 전달 된 로거가 있습니다. logger.Log (GetType(), msg)과 같이 로거를 사용할 때마다 형식 정보를 전달하는 것이 가장 쉽다는 것을 알고 있습니다. 내가 원했던 것은 로거가 해당 유형 정보를 로거 메소드에 전달하지 않고 해당 클라이언트 유형 정보를 가지고 있기 때문에 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을 등록 할 수 있어요 StockProvider 또는 기타 클라이언트 유형인지 여부를 로거에 요청하는 클라이언트의 clientType? 코드에서 널리 사용되는 일부 클래스의 예와 같이 로거를 사용했음을 유의하십시오. 또한 같은 당신은 일반적인 로거를 만들 수있는 이벤트

답변

2

을 유발 누구인지 알고 싶을 경우 게시자의 일종 수 있습니다 : 당신이 ILogger의 일반적인 구현을 등록해야 지금

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

그리고 당신의 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

관련 문제