2010-12-06 3 views
0

이것이 매우 간단하고 실종되었거나 더 많은 것이 있다면 궁금합니다.타입 정의 생성자를 사용하는 세터 주입

기본적으로, 내가하려는 것은 로거 구현을 위해 StructureMap의 setter 주입을 사용하는 것입니다. 내가 사용 StructureMap을 기원 로거의 생성자는 로거 만들기위한 Type 매개 변수를 받아 내 부트 스트랩 코드에서

public class Logger : ILogger 
{ 
    private ILog _log = null; 

    public Logger() { _log = LogManager.GetCurrentClassLogger(); } 

    public Logger(string name) { _log = LogManager.GetLogger(name); } 

    public Logger(Type loggerType) { _log = LogManager.GetLogger(loggerType); } 

    // The rest of the implementation... 
} 

를, I는 따라서 초기화 : 그것은 확실히 작동하지

ObjectFactory.Configure(x => { 
    x.FillAllPropertiesOfType<ILogger>().Use(l => 
     new Logger(l.BuildStack.Current.ConcreteType)); 
    // Further unrelated bootstrapping... 
}); 

100 %, 그리고 그것은 아마 내 부분에 대한 완전한 이해 부족이다.

  1. "형식"나는 디버거를 통해 단계와 log4net 구현 드릴 다운 할 때 로거는보고있다 즉, ILogger이다 : 그래서 행동 제가 보는 관한 몇 가지 질문이 있습니다. 주입기가 들어있는 유형의 장치를 어떻게 얻을 수 있습니까?
  2. StructureMap 빌드 인스턴스의 설정자 만 설정됩니다. 예를 들어, 데이터 액세스 계층에 대한 저장소 인터페이스/구현에서. 내 비즈니스 모델과 같은 다른 개체는 StructureMap 그래프에서 작성되지 않고 정상적으로 인스턴스화됩니다. StructureMap에 이들을 삽입하도록 지시 할 수있는 방법이 있습니까? 나는 그것이 존재하지 않는다고 상상한다. 어떻게 알 수 있겠는가? 그렇다면 제대로 구성된 로거 유형을 어떻게 해결할 수 있습니까? (서비스 분석기를 통해 수행자를 호출하는 방법을 알고 있는데,이 특정 필요를 위해 호출하는 방법이 아닙니다.)
  3. "이게 옳다고 생각하지 않습니다." 어쩌면 명명 된 인스턴스에 대해 뭔가 빠졌을까요? 부트 스트 래퍼가이 구현을 그래프로 나타낼 수 있다면, 어떻게/언제 세터를 가진 각 클래스마다 다른 인스턴스를 제공할까요?

은 어쩌면 내가 할 노력하고있어 달성하기 위해 완전히 다른/간단/더 나은 방법이, 그리고 그 제안을 환영합니다. 기본적으로 IoC 컨테이너 뒤에 로깅 구현을 추상화하고 있으며 클래스 별 로거가 필요합니다.

답변

1

아마도 이것이 정확한 답변이 아니지만 ILoggerFactory을 만들어 모든 것을 단순화하지 않으시겠습니까? 대신 ILogger를 등록, 당신은 ILoggerFactory을 등록하고 수업에 ILoggerFactory를 주입 할 수 있습니다 : 재미

public interface ILoggerFactory 
{ 
    ILogger CreateFor(string name); 
    ILogger CreateFor<T>(); 
    ILogger CreateFor(Type loggerType); 
} 

public class LoggerFactory : ILoggerFactory 
{ 
    public ILogger CreateFor(string name) 
    { 
     return LogManager.GetLogger(name); 
    } 

    public ILogger CreateFor<T>() 
    { 
     return CreateFor(typeof(T)); 
    } 

    public ILogger CreateFor(Type loggerType) 
    { 
     return LogManager.GetLogger(loggerType); 
    } 
} 
+1

합니다. 그것은 단지 갈 길일 것입니다. 올바른 로거를 직접 주입하는 것만큼이나 우아하지는 않지만 작동 할 수있는 것입니다. 솔직하게 말해서, 나는 기존의 구현을 완전히 우아하게 보지 못했습니다. 클래스의 내부 로거에 대해 공개적으로 설정할 수있는 것은 바로 나와 맞지 않습니다. (참고 : 이것은 제 구현이 아니므로 부트 스트랩을 시도하는 것입니다.) – David

+1

나는이 것을 꽤 우아하게 만들었지 만 핵심 원칙은 당신이 제안한 것과 동일합니다. My IoC 부스트 래퍼는 이제 ILoggerFactory와 기본 ILogger를 연결합니다. 이전 ILOGger는 기본 이외의 로거를 잡아낼 수 있습니다. 제안 해 주셔서 감사합니다! – David

+2

Btw. 유형별 로거 인스턴스를 정말로 사용해야합니까? 나는 이것이 log4net의 기능이라는 것을 알고 있지만, 나는 이것을 결코 필요로하지 않았다. 개발자가 실제로 예외를 던져야하는 장소에 정보를 기록하는 경우가 종종 있습니다. 로그에 쓸 필요가없는 몇 가지 경우에는 메시지가 명확하게 표시되도록 메시지를 명확하게 표시 할 수 있습니다 (이미 스택 추적이없는 경우). 이 작업을 수행 할 수 있으면 ILogger를 다시 삽입하여 싱글 톤으로 등록 할 수 있습니다. 인생을 훨씬 쉬워줍니다. – Steven

관련 문제