2010-04-05 2 views
0

저는 ASP.NET Web Forms 응용 프로그램이 있으며 발표자가 노출하는 내용에 따라보기에서 일부 동적 컨트롤을 사용하고 있습니다. 이 경우보기가 해당 데이터의 발표자를 끌어 당기는 것이 좋습니까? 테스트 가능성과 느슨하게 결합 된 디자인을 고려할 때 특별히주의해야 할 사항이 있습니까?보기에서 MVP 패턴으로 발표자를 가져 오는 방법

이 경우 페이지에는 페이지 수명주기가 있으며 발표자는 이에 대해 알지 못합니다. 그러나 페이지 수명주기는 일일이 페이지 수명주기의 특정 순간에 발생해야한다고 규정합니다. 이 냄새가 문제가되는 것처럼 ... 어떤 알려진 구덩이가 떨어지나요?

내 콘크리트 뷰가 생성 될 ASP.NET 서버 컨트롤의 무리가 발생합니다 컬렉션에 대한 발표자에 끌어 초기화 이벤트 안타 편집

. 발표자가 페이지 수명주기 초기화 이벤트에 응답하는 방법을 알지 못하지만보기가 동적 컨트롤로 채워지는 경우에해야합니다.

+0

발표자가 페이지 수명주기를 인식해야하는 이유에 대해 아직 명확하지 않습니다. 발표자가보기에만 컬렉션을 제공하지 않습니까? 보기에서 서버 컨트롤을 만들고 렌더링하지 않습니까? – BlackICE

답변

1

이것은 궁금한 질문입니다. ASP.NET 웹 양식에서 동적 컨트롤을 원할 경우 덜 나쁜 것 중 하나를 선택해야합니다. 궁극적으로, 그것은 타협점을 만들고 싶습니다. 즉, 발표자가보기에 관심을 갖거나 발표자의 관심사를 볼 수 있습니다.

내가 웹 양식에서 작업 할 때 나는 보통 후자를 선호 - 내가 발표자는 ASP.NET 페이지의 라이프 사이클에 연결되는 것을 동의하고 동적 컨트롤 생성하는 것이 필요 무엇이든 할 수있는 InitializeView 방법 작성 :

// Presenter 
// This could also be parameterless if you prefer that idiom but 
// then the view needs a SelectedState property that serves up values 
// straight from the Form collection, and it won't be obvious why. 
public void InitializeView(string selectedState) { 
    if (selectedState != null) { 
     view.Counties = dataLayer.GetCounties(selectedState); 
    } 
} 

// View 
protected void Page_Init(object sender, EventArgs args) { 
    presenter.InitializeView(Request.Form["StateList"]); 
    // ... build counties drop-down ... 
} 

물론, 이는 발표자의 의미를 ASP.NET 수명주기와 연결하고 해당 메서드에서 진행중인 작업을가립니다. 에 ProcessSelectedState과 같은 더 구체적인 이름을 지정하여 완화 할 수 있지만 메소드 이름이 페이지 수명주기를 참조하지 않는 한 나머지 모델을 가져 오는 것이 아니라는 것을 분명히 알 수는 없습니다 (presenter.LoadModel 또는 기타 당신은 그것을 부를지도 모른다).

나는 대안이 매력적입니다 방법을 볼 수 있습니다 다음 Presenter

protected void Page_Init(object sender, EventArgs args) { 
    if (Request.Form["StateList"] != null) { 
     List<string> counties = presenter.GetCounties(Request.Form["StateList"]); 
     // ... build counties drop-down ... 
    } 
} 

의미 체계가 완벽하게 명확하다 - GetCounties가 무엇을 이해하기 쉽게 그리고 그것은 페이지 수명주기와는 아무 상관이 없습니다. 그러나 당신은 당신의 견해에있어 테스트할만한 것들을 가지고 있습니다. 그것은 어설픈데, 그것은 내 발표자들이 그들의 뷰 엔진을 모르는 채로 유지하는 것보다 나에게 더 중요합니다.

다른 대안은 페이지 초기화 중 모델 전체를 로드하는 것입니다. 서버 제어 값을 사용할 수 없으므로 Request.Form의 값을 가져와야합니다. 이는 관용적 인 ASP.NET 고전이 아닙니다. 대부분의 웹 양식 개발자가 POST 데이터에서 직접가 아니라 웹 컨트롤에서 직접 값을 가져 오는 것에 익숙하기 때문에 과도하게 혼란 스러울 수 있습니다.

+0

매우 통찰력있는 답변을 보내 주셔서 감사합니다. 불편을 끼쳐 드려 죄송합니다.내게는 그것이 옳지 않거나 그릇된 것 같아서 테스트 할 수있는 것이고 속성을 갖는 것이 중요하다고 생각하는 것입니다. –

0

IMO 발표자는보기가/etc/bind와 같은 데이터를 가져 오는 것으로되어 있습니다. 발표자는 단위 테스트를 거친 작품입니다. 두 번째 성명서에서이 페이지에 대해 여러 명의 발표자가 필요할 것 같지만 더 자세한 정보가 필요합니다.

관련 문제