모델 뷰 프리젠터, 뷰 간에 엔터티를 전달하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/534054

  •  22-08-2019
  •  | 
  •  

문제

편집하다 :Chris Holmes의 답변을 수락했지만 누군가 더 나은 방법을 생각해낸다면 항상 리팩토링할 준비가 되어 있습니다!감사해요!

MVP로 몇 가지 winform을 수행하면 엔터티를 다른 뷰에 전달하는 가장 좋은 방법이 무엇입니까?

내가 가지고 있다고 가정 해 봅시다 CustomerSearchView/Presenter, doubleClick에서 다음을 표시하고 싶습니다. CustomerEditView/Presenter.나는 내 관점이 모델에 대해 알기를 원하지 않기 때문에 모델을 취하는 행위자를 만들 수 없습니다. ICustomer 매개변수에서.

내 반사신경은,

CustomerSearchView 새로 만들기 CustomerEditView, 자체 발표자를 만듭니다.그럼 내 CustomerSearchView 다음과 같은 일을 할 것입니다 :

var customerEditView = new CustomerEditView();
customerEditView.Presenter.Customer = this.Presenter.SelectedCustomer;

다른 가능한 접근 방식은 다음과 같습니다. CustomerDTO 수업하고, 만들어보세요. CustomerEditView 그 중 하나를 받아들인다 CustomerDTO, 하지만 간단한 일이 많은 일이라고 생각합니다.

기본적인 질문이라 죄송합니다. 제가 찾을 수 있는 모든 예제는 그 지점에 도달하지 못했습니다. 이는 브라운필드 프로젝트이고 지금까지 사용된 접근 방식은 저에게 두통을 안겨줍니다...

도움이 되었습니까?

해결책

나는 당신이 당신의 견해를 어떻게 보여주고 있는지 정확히 모르기 때문에 여기에 구체적인 조언을하기가 약간 어렵습니다. 이것이 내가 전에 이런 일을 한 방법입니다.

우리가 한 일은 CustomersearchViewPresenter가 OpenCustomer (CustomerID)와 같은 이벤트를 발사 한 것이 었습니다. (검색보기에는 몇 가지 고객 데이터가 있고 고객 데이터가 그 중 하나라고 가정합니다. 검색보기가 전체 고객 객체가 나열되면 OpenCustomer (고객)에 호출 할 수 있습니다. 그러나 나는 구축하지 않을 것입니다. 검색보기 및 전체 객체로 채워 지도록 허용합니다 ... 검색보기를 데이터 측면에서 가볍게 유지합니다.)

응용 프로그램의 다른 곳에는 OpenCustomer () 이벤트를 듣고 발표자가있는 새로운 customereeditview를 작성하는 작업을 수행하는 이벤트 핸들러가 있습니다. '새로운 "키워드를 어디서나 사용해야합니다). 뷰가 만들어지면 ID (또는 고객 객체)를 따라 새로운 CustomerEDITView로 전달한 다음 표시 할 수 있습니다.

OpenCustomer () 이벤트를 나열하고 CustomerEDitView의 생성을 수행하는이 클래스는 일반적으로 앱의 일종의 컨트롤러 클래스입니다.

이 상황을 더욱 단순화하기 위해, 나는 이것을 또 다른 방법으로 수행했습니다 : 나는 응용 프로그램 또는 모듈이 시작될 때 customersearchview (& presiser)와 customerEditView (& presiser)를 모두 만듭니다. CustomersEarchView가 편집을 위해 고객을 열어야 할 때 CustomerEDITView는 OpenCustomer 이벤트의 응답자가되어 데이터를 자체로로드하고해야 할 컨테이너로 스스로를 표시하는 방법을 알고 있습니다.

따라서이 작업을 수행하는 방법에는 여러 가지가 있습니다.

다른 팁

어때요 :

//In CustomerSearchPresenter
var presenter = new CustomerEditPresenter();
var customerEditView = new CustomerEditView(presenter);
presenter.SetCustomer(customer);

//In CustomerEditPresenter
public void SetCustomer(customer)
{
    View.Name = customer.Name;
    View.Id = customer.Id;
    ...
}

고객 검색보기는 발표자에게 위임해야한다고 생각하면 작업 실행이 필요합니다.

모든 MVP 코드에서 자연스러운 흐름을 얻는 데 중요한 통찰력이 몇 가지 있습니다.

  1. 다른 방법이 아니라보기를 주도하는 것은 발표자입니다.
  2. 1. 1 때문에, 견해는 발표자의 존재에 대해 알 필요가 없습니다. 적은 종속성은 일반적으로 유지 보수가 쉬운 것을 의미합니다.

C#에서는 시야에서 발표자를 분리 할 때 이벤트가 훌륭한 자산이라는 것을 알게됩니다. 이전 답변의 자세한 내용 : Winforms의 모델 뷰-프리 센터

  1. Ms Prism 4와 그들의 멋진 탐색 인터페이스를 살펴 보겠습니다. 또한 Silverlight 및 WCF Navigation을보십시오. 그들은 잘 완료되었으며 "더러운"형태의 확인을 위해 사용자에게 취소와 같은 일을 처리합니다.

  2. WCF의 PageFunction () 문서도 다른 사람에게서 "호출"하는 방법에 대해서도 정보를 얻을 수 있습니다.

작동 방식은 다음과 같습니다 (JavaScript, 죄송합니다) :

사용자 목록에서 고객을 두 번 클릭합니다.

CustomerList.onDblClick(customerId){

  app.fireEvent('customerEditRequest', id)

}

...

app.onCustomerEditRequest(id){
  this.mainRegion.requestNavigate('customers/edit', id);
}

보기를 편집하기위한 탐색이 성공한 경우 ...

CustomerEditView.onNavigatedTo(context){
  this.model.load(context.parameters.id));
}

CustomerEditView.onSaveButtonClick(){
  this.model.save();
  app.fireEvent('customerEdited', id);
}

...

app.onCustomerEdited(id){
  app.mainRegion.requestNavigate('customerlist', id);
}

할 수있는 몇 가지 방법이 있습니다.

  1. 고객 목록에서 콜백 함수를 편집 양식으로 보냅니다. 편집 양식이 호출되면 호출 할 때 원하는 것을 수행합니다.

  2. 듣고 반응하는 "고객 편집"이벤트에서 편집 양식을 올리도록하십시오 (앱 전체 버스 없음).

  3. 응용 프로그램 전체 이벤트 버스를 사용하여 이벤트를 중앙에서 관리합니다.

나는 내 견해를 발표자들과 소통하곤 했지만, 그로부터 멀어졌습니다.이는 패턴의 원래 정의를 따르지 않습니다(그 자체로는 이러한 이점을 정확하게 제공하기 위해 기여 요소를 벗어나는 이유가 아님).이상적으로 뷰는 멍청하고 가능한 한 적은 종속성을 유지해야 합니다.View는 대리자/이벤트/일부 "fire-and-forget" 메커니즘을 통해 발표자(모든 "관찰자")와 통신해야 합니다.실제로 저는 View 이벤트를 가로채고 발표자에게 다시 실행(드물게)하거나 발표자와 통신하거나 시스템 또는 발표자별 이벤트 버스와 통신하기 위해 특별히 MVP에 컨트롤러를 도입했습니다. 뷰를 터치하지 않고 사용자 작업 경고 메커니즘을 변경합니다.하지만 이벤트 버스를 조심해야 합니다.곧 거기에 모든 이벤트가 발생하기 시작하고, 앱이 이벤트를 처리하는 데 수다스럽거나 정체되고, 이벤트는 .Net에서 가장 빠른 것이 아닙니다.특히 앱이 사용자와 보다 "대화적인" 상호 작용을 해야 하는 경우에는 Sunchronization이 추가된 문제입니다.

Presenter는 일반적으로 뷰/프로세스별로 다르지만 뷰(및 뷰 모델)는 재사용될 수 있다는 점을 명심해야 합니다.View가 Presenter와 포함/위임 관계에 있으면 View가 강력하게 결합/재사용이 제한됩니다.이는 일부 DI로 줄일 수 있지만 대부분의 경우 DI 컨테이너가 불필요하게 복잡하다고 생각합니다(어차피 객체를 생성하는 방법을 알아야 하고 객체를 생성/테스트한 후 의미상 유사한 다른 객체로 얼마나 자주 변경합니까?) ?).구체적인 종속성은 다른 레이어를 제외하고는 어디에도 없으며 더 많은 모호함을 추가하고 디버깅/추적을 더 어렵게 만듭니다.하지만 최근에는 "단순성"에 관심을 갖고 있으며 대부분의 앱에 대해 Factory/객체 생성/ORM 매핑을 선호합니다. 왜냐하면 일반적으로 "1:1" btw DB 테이블/엔터티가 있고 추가할 필요가 없기 때문입니다. 일반적인 컨텍스트/다양한 앱을 제공해야 하는 필요성으로 인해 작동 방식을 이해하더라도(요점이 아님) 상황을 필요한 것보다 더 어렵게 만들어야 하는 일반 타사 ORM 도구의 복잡성.

더욱이, View가 MVP(MVC에서와 같이)의 모델을 관찰하는 것이 여전히 가능하므로 이를 배제하는 것이 그렇게 빠르지는 않습니다.나는 이것을 스스로 하는 것을 선호하지 않지만 이것이 패턴을 "깨지는" 것은 아닙니다.사실, 나는 MVC 구성 요소의 "원형 루프"를 좋아하지 않았기 때문에 약 10년 전에 MVP와 유사한 것을 개발했습니다(모델에 대해 알고 있는 보기).나는 이러한 모든 패턴(MVC 포함)이 공언하는 View와 Model을 더 깔끔하게 분리하고 View를 가능한 한 멍청하게 유지하려는 욕구를 선호했습니다(Model을 관찰하면 View가 Model 변경을 처리하는 데 더 많은 지능이 필요하다는 것을 의미합니다).결국 내가 한 일은 모델의 "하위 구조"를 사용하여 뷰에 전달하고 "변경 알림자" 역할을 하는 MVVM 및 전략 패턴과 같은 것이었습니다.이로 인해 모든 뷰가 목적에 따라 다르고 유연/재사용 가능하게 유지되었습니다(어려운 콤보).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top