2010-02-07 2 views
12
모두가 맛이 소유하고있다 있도록 MVVM 현재 표준화가 부족 Silverlight posted

사람 .. 저와 WPF 제자에서 몇 사람이 적극적으로 MVVM의 요소 모두가 합의한하는 논의 이유MVVM 표준화

. 저는 패턴을 여러 가지 방법으로 구현했으며 프로젝트의 필요에 따라 여러 패턴을 혼합하거나 자체 패턴을 만들거나 개발자의 삶을 편하게 만듭니다. 그러나 이러한 어려움이나 프로젝트의 특별한 필요성을 잊지 마십시오. . 모두가 동의 한 MVVM 패턴의 표준 규칙에 대해 논의 해 보겠습니다. 나는 some of my thoughts here도 올렸다.

왜 MVVM입니까?

  • Testabiltiy (뷰 모델보다 단위 테스트에 쉽게 코드 숨김 또는 이벤트 기반 코드)
  • 이보기
  • 모델의 "혼련을"결코 증가하지 UX 디자이너와 개발자 사이의
  • 지우기 seperation에 보기에 대한 변경을 지원하기 위해 변경해야 함
  • 보기 변경을 지원하기 위해 ViewModel을 변경할 필요가 거의 없음
  • 보기를 복제 할 중복 코드가 없음

않고 ​​안보기

  • 테스트 할 어떤 논리를 포함 할 수 없습니다 : 글렌은 MVVM, 우리는 코드에서 코드를 작성할 수있는 코드 계산 운동이 아니라고 말했듯을 -뒤에. 하지만 테스트 할 로직을 작성해서는 안됩니다. 예 : 사용자가 국가를 선택한 경우보기에 주 또는 도시 목록을 표시하려고합니다. 이것은 비즈니스 요구 사항이므로이 논리를 테스트하기위한 단위 테스트가 있어야합니다. 따라서 코드 숨김으로 작성해서는 안됩니다.
  • 은 컨트롤 또는 데이터 템플릿이 될 수 있습니다.
  • 가능한 한 간단하게보기를 유지하십시오. : XAML에서 Data Trigger 또는 Value Converter 또는 Visual State 또는 Blend Behivor를 조심스럽게 사용할 수 있습니다. 뭔가 바인딩이 아닌 경우
  • 사용 연결된 속성 :

않고하지 마십시오 뷰 모델에

  • 커넥터 당신이 할 수있는 (보기 및 모델
  • 뷰 상태, 값 변환을 유지 사이 ValueConverter를 사용하는 대신 ViewModel에 표시 할 데이터 구조를 생성하십시오 예 : 이름과 성 대신 이름을 표시해야합니다 모델에는 이름과 성이 있지만 이름 속성은에서 만들 수 있습니다. ViewModel.)
  • 은 (가능한 한 검증 VM을 확인보기의 없음) 강하거나 인터페이스를 통해 (약 참조하지 예를 들어 싱글 클래스에는 호출 없음)
  • VM (에 물건을 관련 통제하지 그런 다음 뷰를 변경하는 경우 때문에 VM을 변경해야합니다.)

모델

  • 데이터 모델이 될 수 DTO, POCO, 당신은 도메인 서비스 및 프리젠 테이션 레이어 사이의 분리를하는 방법에 따라 도메인 클래스 및 UI 모델의 자동 생성 된 프록시
  • 뷰 모델

에 대한 참조 당신은 어떤 제안이 있거나 그것에 대해 언급 하는가?

우리 그룹에는 하나의 의견 차이가 있습니다. ViewModel에서 View의 인터페이스를 사용하는 것은 괜찮습니다. 그러나 View Model이 View의 인터페이스를 가지고 있다면 MVP 패턴이 될 것이라고 말합니다. 우리 MVVM 전문가의

하나는 MVVM 대 MVP

보기에 대해 말할 => 뷰 모델

  • MVVM 뷰가 직접에서
  • 데이터 바인딩을 통해 뷰 모델과 VM에 회담에 바인딩 MVP에서 뷰는 SupervisingController에 걸려 있거나 전혀 바인딩되지 않은 모델 (수동 뷰)에 바인딩됩니다.

뷰 모델 =>보기

MVVM

  1. INPC/속성 바인딩
  2. 이벤트 중개자를 통해
  3. 메시지 (이벤트 그리 게이터/메신저/RX 프레임 워크)
  4. 인터페이스를 통해
  5. 대리인을 통해 (뷰 패스는 다시 호출하는 데 사용할 수있는 VM에 위임합니다. 예를 들어, VM은 뷰 호출이 전달하는 SetActions 메소드를 공개 할 수 있습니다.

표준 발표자 협상 되돌려 인터페이스 바인딩을 통해, 또는 수동보기의 경우 속성 통해서 뷰되는 MVP 케이스

MVP

. 패시브 뷰에서는 속성이 데이터 바인딩을 사용하지 않고 대신 뷰 속성 getters 및 setter를 사용하여 컨트롤 값을 직접 설정합니다.

그 생각에 대해 어떻게 생각하십니까?

ViewModel의보기 인터페이스가 괜찮습니까?

당신은 추가에 오신 것을 환영합니다 다음 추가를 추가 할 경우

...이 게시물에 대한 :)

전체 아이디어는 커뮤니티에서 MVVM 패턴의 동일한 이해를 얻을 수 있습니다.

+0

당신이 쓴 내용을 좋아하고 당신이 여기에 게시 기쁘다. – chakrit

+0

확실합니다.이 질문을 커뮤니티 위키로 이동하는 방법? 죄송합니다 .. 누군가가 나를 옮길 수있게 도와 줄 수 있습니까? 또는 이동 방법을 알려주십시오. 감사. –

+0

저는 이것이 cwiki로 살기에는 너무 많은 논쟁이라고 생각합니다. 그러나 다른 생각을 보게 될 것입니다. – bmargulies

답변

2

나는 당신이 작성한 것을 좋아합니다.정말 저를 괴롭히는 것 중 하나는 많은 사람들이 자신의 VM을 자신의 View에 매우 밀접하게 결합시킨 것입니다 -이 작업을 수행하는 경우 오래된 작업을 수행하는 것일 수도 있습니다. XAML + 모든 것이 코드 뒤에 있습니다. 건.

내가 사용하는 패턴은 MVVM의 약간 변형입니다 (그러나 대부분 동일합니다). 개인적으로 필자는 View에 인터페이스로 주어진 ViewModel을 갖기를 원합니다. 분리를 매우 깨끗하게 유지합니다. 프로토 타입을 수행 할 때 많은 이점이 있습니다. ViewModel에 거의 또는 전혀 영향을주지 않고 시각적 요소를보기에서 또는 밖으로 전환 할 수 있습니다.

+0

감사합니다. 전문가들의 의견을 얻기를 희망합니다. 그러나 ppl은 이것에별로 관심이 없습니다. :) –

+0

MVVM 패턴을 깨고 뷰의 코드 숨김에 많은 코드를 넣지 않고 viewmodel을 인터페이스로 사용하여 뷰에 바인딩하는 방법을보고 싶습니다. –

+1

@RafaelFernandes 이것은 특히 Unity 또는 유사한 제품 중 하나를 사용하는 경우 모두 쉽게 달성 할 수 있습니다. VM이 뷰의 생성자에 삽입되면 뷰의 코드 숨김에 한 줄의 코드 만 있으면됩니다 :'this.DataContext = myViewModel;'. Codebehind는 뷰와 관련되어 있고 바인딩을 통해 수행해야하는 작업을 수행하지 않는 한 완벽하게 괜찮습니다 (0 코드 비헤이비어는 무지개 끝 부분에 금 냄비와 같음 - 이상 주의적이지만 대부분은 실현 불가능합니다. 가장 기본적인 앱). – slugster

0

데이터 바인딩을 통해 View ViewModel 간의 통신이 MVVM을 다른 패턴의 관심사와 대비되는 자체 패턴으로 만드는 것이라고 생각합니다. VM이 인터페이스를 통한 뷰에 대해 잘 알았는지 여부는 좋지 않지만, 사용되는 패턴을 의사 소통하는 컨텍스트에서는 MVVM이 아닙니다.

표준을 얻고 유지하는 데 따르는 어려움 중 일부는 슬프게도 WPF 및 Silverlight의 단점과 복잡성에 있습니다. 그러나 여러 개의 유효한 표준이있는 경우 Martin Fowler 모자를 착용하고 "사용시기"섹션을 추가합니다.

표준은 현지화와 같은 교차 관심사를 다루고 있습니까?

FWIW 나는 ...

건배,
Berryl 나는이 질문은 커뮤니티 위키해야한다고 생각