2010-04-25 3 views
0

Martin Fowler의 프레젠테이션 모델 노트 및 프레젠테이션 모델에 대한 MSDN 설명서에 따르면 프레젠테이션 모델 클래스는 UI 클래스 및 이와 유사하게 비즈니스를 인식하지 못한다고 설명합니다 모델 클래스는 프레젠테이션 모델 클래스를 인식하지 못합니다.프레젠테이션 모델을 사용하여 부모 폼 자식 폼 관계를 처리하는 모범 사례

UI는 프레젠테이션 모델에 광범위하게 데이터 바인딩되어야하며, 프레젠테이션 모델은 차례대로 하나 이상의 도메인/비즈니스 모델 개체와 공동 작업하여 작업을 완료합니다. 프레젠테이션 모델은 기본적으로 UI에서 최대 데이터 바인딩을 용이하게하는 방식으로 도메인 모델 데이터를 제공하므로 UI가 가능한 한 적은 의사 결정을 할 수있게하여 프레젠테이션 동작의 테스트 가능성을 높입니다. 이는 또한 프리젠 테이션 모델 클래스를 일반적인 것, 즉 임의의 특정 UI 기술에 대해 불가지론하게 만든다.

List 폼 (CustomerList)이 있고 다른 루트 폼 (Customer)이 있고 버튼 클릭시 CustomerList 폼에서 고객을 편집 할 수있는 사용 사례가 있다고 가정 해보십시오.

간략하게하기 위해 고객 목록이 메뉴 (즉, 고객 메뉴 클릭)에서 열리고 고객 목록이 메뉴 클릭 이벤트에서 표시된 경우 일부 동작이 발생했다고 간주하십시오.

이제 위의 사용 사례에 따라 고객 목록에서 Customer Root UI (단일 고객)를 열어야합니다. 어떻게해야합니까?

  1. 편집 버튼의 클릭 이벤트에 필요한 객체 (BusinessModel, PresentationModel, UI)를 빌드하고 거기에서 CustomerEdit UI를 호출 하시겠습니까?

  2. 프레젠테이션 모델 클래스에서 CustomerEdit UI를 빌드하고 프레젠테이션 모델에서 UI를 표시 하시겠습니까? 아래의 두 가지 방법 중 하나로이 작업을 수행 할 수 있습니다. a. 다음 순서로 개체를 만듭니다. DomainModel-> PresentationModel-UIForm b. Unity.Resolve()를 사용하십시오. 어느 쪽이든, P 모델이 CustomerEdit이있는 구체적인 UI 어셈블리를 참조해야하므로 Presentation Model을 위반합니다. 또한 P 모델은 WinForm을 참조하고 사용하여 직접 UI 기술에 대한 불가지론을 덜어 줘야합니다.

위반 사항은 이론적으로 무시할 수 있지만 잘못된 방향으로 가고 있는지에 대한 커뮤니티 의견을 구합니다. 목록 (학부모) 양식에서 하위 양식을 호출하는 더 좋은 방법이 있는지 제안하십시오.

  • Rajarshi

답변

0

당신의 목표는 일반적으로 다른 부분 사이의 느슨한 결합 쉽게 유지 보수의 이익을 위해 시스템이다. 즉, 예를 들어 모델에서 통신하는 정확한 유형을 모르는 상태 여야합니다. 필요한 인터페이스에 대해서만 알고 있어야합니다.

모델이 특정 유형 대신 인터페이스로 작동하는 한 UI 또는 비즈니스 로직 계층에서 모델이 참조 할 때 이상하거나 이상한 점이 없습니다.

+0

"모델에서 UI에서 뭔가를 참조합니다"라고 말하면 도메인 모델 또는 프리젠 테이션 모델을 의미합니까? 도메인 모델 (Domain Model)을 말하면 더욱 강경 한 규율 인 "Separation of Concerns"에 위배되므로 동의하지 않을 것입니다. 프레젠테이션 모델을 말하면 동의하지만 여전히 더 나은 제안과 권장 사항을 찾고 있습니다. – Rajarshi

+0

또한 UI가있는 경우에도 인터페이스로 작업 할 것을 제안합니다. UI 코드의 성격 (모든 곳의 이벤트)을 고려하면 너무 실용적 일 것입니다. 그런 식으로, 아키텍처가 유지할 수있는 클래스의 수를 생각해보십시오. 1. 도메인 모델 2. 도메인 모델 인터페이스 3. 프리젠 테이션 모델 4. 프리젠 테이션 모델 인터페이스 5. UI 인터페이스 6. UI 인터페이스 – Rajarshi

0

IEditCustomerService를 CustomerList의 PresentationModel에 삽입하는 것은 어떻습니까? 선택한 Customer를 편집해야하는 경우에 호출됩니다. 그런 다음이 서비스는 "필요한 객체 만 빌드"하거나 IViewManagerService에이 태스크를 위임합니다.이 UI는 엔티티를 편집하는 데 사용할 수있는 UI, 특정 UI에 사용해야하는 UI 및 모자 UI 구성 요소를 빌드하는 방법을 알고 있습니다. .물론 IViewManagerService를 PresentationModel에 직접 삽입하여 간접 참조를 피할 수도 있고 DI 컨테이너를 사용하여이를 해결할 수도 있습니다.

또 다른 가능성은 IViewManagerService 구현이 CustomerList의 PresentationModel에 의해 실행 된 EditCustomerEvents를 수신하도록하는 것입니다.

관련 문제