2009-09-23 3 views
1

ASP.Net Web Forms에는 주문 종속 코드를 생성하는 경우가 있습니다. 분명한 코드 냄새로서 나는이 문제를 해결할 해결책을 찾고있다.코드에서 이러한 순서 종속성을 어떻게 제거합니까?

의사 코드 예제는 다음과 같습니다

호출 코드 : Page.aspx

protected void Page_Load(...) { 
    var control = LoadControl("ControlX.ascx"); 

    // Ugly since the control's constructor is not used by LoadControl 
    control.SetDependencies(...); 
} 

제어 코드 :: ControlX.ascx

public void SetDependencies(...) { 
} 

protected void Page_Load(...) { 
    if (dependencies are null) 
     throw Exception(); 
    else 
     ContinueProcessing(); 
} 

LoadControl가있다 두 개의 서명이있는 경우 one used above은 컨트롤 c의 문자열을 허용합니다. 물리적 위치를 채우고 자식 컨트롤을 올바르게 만듭니다. second signature은 컨트롤 클래스를 클래스 유형으로, 생성자의 모든 매개 변수를 허용하지만 자식 컨트롤은 이 아니며이 아니며 TRULY Understanding Dynamic Controls으로 생성됩니다.

그럼 내가 어떻게이 순서 의존성을 가장 깨끗한 방법으로 제거 할 수 있습니까? 내 첫 번째 생각은 내가 동적으로 자식 컨트롤을 ControlX에 만들었지 만 큰 컨트롤에서는 성가신 일이 될 수 있습니다. 생각?

ControlX.ascx의 호스트 (다른 ​​컨트롤 또는 페이지 하나가) (ControlX에 의해 정의 된) 특정 인터페이스를 구현해야합니다

답변

3

당신은이 같은 실행 종속을 반전 할 수 (내가 제대로 이해 문제에 바란다). 그런 다음 ControlX은 해당 인터페이스를 통해 호스트에서 종속성에 액세스 할 수 있습니다.

public interface IControlXHost 
{ 
    // methods, properties that allow ControlX to access its dependencies 
    int GetStuff(); 
} 

public partial class ControlX : System.Web.UI.UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     var host = (Parent as IControlXHost) ?? (Page as IControlXHost); 
     if (host == null) { 
      throw new Exception("ControlX's parent must implement IControlXHost"); 
     } 
     else { 
      int number = host.GetStuff(); 
     } 
    } 
} 

호스트 (페이지 또는 ControlX를 호스팅하는 제어) 그 인터페이스를 구현해야합니다, 예를 들면 :

public partial class Default4 : System.Web.UI.Page, IControlXHost 
{ 
    public int GetStuff() { 
     return 33; 
    } 

    protected void Page_Load(object sender, EventArgs e) { 
     var control = LoadControl("ControlX.ascx");  
    } 
} 

IMO,이 방법

작은 예는이 될 것이다 컨트롤을 호스팅하기 위해 수행해야하는 요구 사항을 "자동으로"알려주기 때문에 컨트롤을 더 쉽게 재사용 할 수 있습니다. 컨트롤의 어떤 메소드를 어떤 순서로 호출해야하는지 알 필요가 없습니다.

+0

네, 올바르게 이해했습니다. 이것은 분명히 효과가있는 것입니다. –

관련 문제