2010-08-05 3 views
15

MVVM-light (RIA 서비스 포함) 모범 사례 모음을 시작하고 싶습니다. 유용한 모범 사례 또는 최선의 방법으로 밝혀진 항목이 많이 있지만 MVVM-light 툴킷을 사용하는 다른 사람들의 의견을 듣고 그들이 무엇을 발견했는지 알고 싶습니다.MVVM-light + RIA Services 모범 사례

모범 사례를이 질문에 대한 답변으로 게시하십시오.

+3

누구나 편집 할 수 있도록이 내용을 커뮤니티 위키로 변환하십시오. –

+0

나는 그것을 com-wiki로 생각하지 않을 것이다. 구도자는이 좋은 질문에 대한 명성을 가질 자격이있다. – Shimmy

답변

25
MVVM 빛의

기본 사용법

  1. 초기화하기
  2. 항상 모든 뷰 모델을 포함하는 ViewModelLocator 클래스를 작성 BaseClass로부터 ViewModels 만들기 App.cs 파일의 Application_Startup 기능에 DispatcherHelper 응용 프로그램에 링크되어 있습니다. 리소스
  3. RelayCommands를 사용하여보기에 함수를 표시하십시오.
  4. DispatchHelper를 사용할시기를 학습합니다.

클린 업 아이디어 :

  1. 적절한 정리에 DomainContext의 EntitySet을 취소하여 뷰 모델에 추가()?
  2. ViewModelLocator의 CleanupSomeVM() 함수를 호출하여 더 이상 애플리케이션에서 더 이상 필요하지 않은 뷰 모델을 지우십시오.

클린업 기능을 사용할시기/방법에 대해 다른 사람들의 의견을 듣고 싶습니다. 내 응용 프로그램이 커짐에 따라 클라이언트 메모리 사용을보다 잘 관리 할 수있는 정리 기능을 추가해야 할 필요성을 느낍니다. 혼련를 들어

:

  1. 인터페이스에 추상 서비스/쿼리 구현

    .
  2. 각 서비스 구현 클래스에 대해 2 개의 클래스를 만듭니다 (디자인에 대해 1, 프로덕션에 대해 1)
  3. 각 ViewModel 내에서 필요에 따라 자체 서비스 클래스 (IsInDesignMode 사용)를 구현하여 Blendable Service 구현을 만듭니다.
  4. 서비스 임 플레멘 테이션 클래스 내에서 DomainContext를 유지하려면 정적 변수를 사용하십시오.
  5. ViewModels의 생성자에 DispatcherHelper.Initialize()를 추가합니다 (디자인 모드에있을 때만). 블렌드는 페이지를로드 할 때 응용 프로그램을로드하지 않으며이 문제를 해결합니다. 추가 된 비즈니스 로직

:

  1. 는 뷰 모델에 후, 먼저 모델에서 비즈니스 로직을 추가합니다.
  2. 모델의 부분적인 방법을 사용하여 적절한 변경/업데이트 이벤트에 대한 논리를 추가하십시오.
  3. 모델에 요약 및 계산 된 값을 제공하는 읽기 전용 속성 (getter 만)을 추가합니다.보기를 들어

:

  1. 항상 로케이터 개체에 루트 바인딩.
  2. 레이아웃 또는 사용자 정의 UI 로직에만 코드 숨김 로직을 유지하십시오. ViewModel을 참조하지 마십시오. 모음에 대한

: 당신의 ViewModels으로 수집

  1. 사용 CollectionViewSource의 DomainContext의 EntitySet
  2. 의 소스를 적용 모든 필터링, 정렬, 당신의 ViewModel에서 CollectionViewSource로 그룹화 논리.
  3. ServiceCalls 후에 UI를 업데이트하는 데 필요한대로 CollectionViewSource 개체의 .View.Refresh()를 호출하십시오. 뷰 모델 조정 (컨트롤러 로직)에 대한

  1. 를 사용하여 메시지 드물게, 너무 많은 복잡성을 관리하기가 어려울 수 있습니다.
  2. NotificationMessage 및 PropertyChangedMessage 클래스를 사용하여 보내기/받기. RIA DomainServices를 들어

:

  1. 이 계속 변경 기능의 모든 로그가 아닌 업데이트/삽입을 구현/로직을 삭제합니다.
  2. 삽입, 업데이트, 삭제 중 탐색 속성을 통해 다른 엔터티를 참조해야하는 경우 먼저 EntityStatus를 확인하거나 다른 Context에서 엔터티를로드하여 EntityStatus 충돌을 방지하십시오. 디버깅/테스트를위한

:

  1. 확인 출력 바인딩 오류에 대한 창 및이를 수정합니다. 바인딩 오류는 자동으로 사용자에게 전달되지 않지만 응용 프로그램 성능과 예상되는 동작을 저하시킵니다.

    1. 1을 유지 :
    2. 서버 측 로직과 기능 엔티티 프레임 워크에 대한

    을 테스트하는 단위 테스트 프로젝트를 만듭니다

  2. 이 추가 된 모델/비즈니스 로직을 확인하기 위해 실버 라이트에서 단위 테스트 만들기 도메인 서비스에 대한 EntitiesContext의 1 대 1 일치. 이 다른 방법으로 분할하려고하면 문제가 발생합니다.
  3. 삽입, 업데이트 및 삭제 논리를 신중하게 작성하는 데 많은 시간을 할애하지 않으려면 [구성] 속성을 사용하지 마십시오.
  4. 별도의 서비스를 사용하여 사용자 정의 유형을 RIA 클라이언트에 다시 제공하십시오. EntityFramework 개체의 DomainService에 추가하지 마십시오.
  5. 삽입, 업데이트, 삭제 기능이 아니라 PersistChangeSet 함수에서 서버 측 업데이트/통합 논리 (다른 시스템 업데이트 등)를 수행합니다.이렇게하면 네비게이션 속성을 통해 실수로 엔티티를 가져 오는 것을 방지 할 수 있습니다.이 경우 분리되지 않은 버전은 업데이트되지 않습니다.
  6. 업데이트/통합 로직 중에 현재 값을 찾으려면 추가 컨텍스트를 만듭니다.