2010-04-01 5 views
0

내 Asp.Net 프로젝트에서 속성 자동 배선을 사용하고 싶습니다. 내 ILogger. 기본적으로 저는 그것을 Property로 사용했습니다. 아래처럼.속성의 자동 배선이 나를 위해 작동하지 않습니다

public class UserControlBase : UserControl 
{ 
    public ILogger CLogger { get; set; } 
    .... 
} 


public partial class IPTracking : UserControlBase 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      string ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
      //it works 
      ILogger logger = ObjectFactory.GetInstance<ILogger>(); 
      logger.LogInfo(string.Format("Client IP: {0}", ip)); 
      //it does not work 
      CLogger.LogInfo(string.Format("Client IP: {0}", ip)); 
     } 
    } 
} 

그러나 상속 된 컨트롤을 호출 할 때 logger는 null입니다. 나는 컨테이너를 점검했고 위의 구현 예와 같이 설정했다. 아래는 Global.asax에서 호출되는 설정입니다.

public static void SetupForIoC() 
    { 
     Debug.WriteLine("SetupForIoC"); 
     ObjectFactory.Initialize(x => 
     { 
      x.FillAllPropertiesOfType<ILogger>().Use<EntLibLogger>(); 
     }); 

     Debug.WriteLine(ObjectFactory.WhatDoIHave()); 
    } 

조언을 주셔서 감사합니다. X.

업데이트 :
- 내가 전에 언급 didnt한다, 그러나 그것 Asp.Net 3.5을 웹 양식.
- 내가 무엇을 놓치고 있는지 알 수 없습니다. 나는 주입이 나중에 프로세스에 참여하게되고 요청 된 클래스에서 설정되지 않기 때문에 그것이 될 수 있다고 생각합니다.

desc. 사용법 : http://structuremap.github.com/structuremap/ConstructorAndSetterInjection.htm#section7

답변

0

다음과 같이 지정하십시오.

FillAllPropertiesOfType<ILogger>().AlwaysUnique().Use(s => s.ParentType == null ? new Log4NetLogger(s.BuildStack.Current.ConcreteType) : new Log4NetLogger((s.ParentType))); 

다른 StackOverflow 응답을 확인해보십시오. 설명하는 항목은 using StructureMap to auto wire loggers입니다.

+0

죄송합니다. 이해가 가지 않습니다. 제안 된 솔루션은 특정 생성자를 생성해야합니까? 현재 클래스 (EntLibLogger) 로깅 클래스에 대한 매개 변수가 적은 매개 변수가 있습니다. 특정 상황에 필요한 클래스를 주입 할 필요가 있습니까? –

+0

내가 사용하고있는 log4net 로거는 유형을 로깅 범위로 사용할 수 있습니다. 시간에 로거 스코프를 수업에 적용시키는 것이 좋습니다. 문제에 대한 컨텍스트를 얻는 것이 매우 빠릅니다. 로거 범위를 어떻게 잡았는지 잘 모르겠습니다. 로거의 구성을 제어 할 필요가 없다면 FillAllPropertiesOfType 이 필요합니다. – KevM

0

어디 실제로 사용자 정의 컨트롤에 CLogger 속성을 설정합니까? 또한 페이지 내에서 하나의 로거를 사용하려는 경우 다음과 같이 할 수 있습니다.

public ILogger CLogger 
{ 
    get 
    { 
    if (this.Page is PageBase) 
     return ((PageBase)this.Page).Logger; 
    else 
     return null; 
    } 
} 
+0

요점은 설정하고 싶지 않습니다. 나는 DI가 나를 위해 그것을하고 싶다. StructureMap 도움말에 따르면이 방법으로 작동해야합니다. 로거 자체는 간단한 로깅 (오류, 정보, 경고)을 위해 코드 뒤에 사용됩니다. –

관련 문제