2010-04-13 4 views
7

서버 측에서 상태없는 서비스 및 빈혈 도메인 개체가 있습니다. 서버와 클라이언트 사이의 모델은 POCO DTO입니다. 클라이언트는 MVVM이되어야합니다. 모델은 20 개의 서로 다른 클래스의 약 100 개의 인스턴스 그래프 일 수 있습니다. 클라이언트 편집기에는 모든 탭/페이지가 포함되어 있으며이 탭은 모두 모델/뷰 모델에 실시간으로 연결됩니다.MVVM 패턴 : 모델 서버 왕복 후 ViewModel 업데이트

제 문제는 서버 왕복 여행 후에 변경 사항을 전달하는 좋은 방법입니다. ViewModel에서 DTO로 변경 사항을 전파하는 것은 매우 쉽습니다. 다시 돌아 가면 이전 DTO를 버리고 새로운 DTO로 대체 할 수 있지만 목록/DataTemplates의 재 작성이 많이 발생합니다.

서버 측 변경 사항을 수집하여 클라이언트 측에 전송할 수있었습니다. 그러나 변경된 필드의 이름은 특정 ViewModel이 아닌 도메인/DTO 전용입니다. 그리고 그 매핑은 저에게 중요하지 않은 것처럼 보입니다. 왕복 여행 후에 반드시해야만한다면 SOC/viewModels의 모듈성이 깨질 것입니다.

저는 automappper 또는 emit mapper와 같은 맵핑 규칙 엔진에 대해 생각하고 있습니다. 그러나 이것은 매우 단순한 사용 사례를 해결합니다. 목록/제거 항목을 추가/변환/변환하는 방법을 알 수는 없습니다. 콜렉션에서 인스턴스를 식별하여 값을 기존 인스턴스와 병합하는 방법. 또한 유효성 검사/오류 정보를 전파해야합니다.

어쩌면 나는 DTO에 INotifyPropertyChanged를 구현하고 그것에 서버 측 이벤트를 재생하려고합니까? 그런 다음 ViewModel을 바인딩합니다. 바인딩이 컬렉션 통합 문제를 해결할 수 있을까요? PRISM의 EventAgregator가 유용합니까? 이벤트 기록 재생 구성 요소가 있습니까?

서버 측 로직이있는 아키텍처에 클라이언트 측 패턴이 더 좋습니까?

답변

1

일반적으로 필자는 Model 클래스에서 DTO에 대한 참조를 유지했습니다. 여러 모델의 경우, 각 모델이 DTO에서 자체를 구성하는 방법을 알고 있는지, 그리고 주입기 "세이버"또는 다른 서비스 공급자 개체를 사용하여 자체를 저장하는 방법을 알고 있는지 확인합니다. 모델에 Save()를 호출하면 모델에 따라 이전 DTO를 수정하여 서비스로 다시 전달하기 때문에 DTO에 대한 참조를 가지고 있으면 쉽게 수행 할 수 있습니다.

Save() 작업 후 다른 객체에 대한 "업데이트"가 다른 DTO에서 전달 될 수 있기를 바랍니다. 그런 다음 다른 DTO가 ViewModel에서 사용되는 적절한 Model 클래스에로드되어야합니다.

위의 단점은 실제로 매핑 코드를 작성해야한다는 것이지만, 이는 일반적으로 가장 쉬운 부분입니다. 나는 이것이 일을하는 가장 좋은 방법이라고 확신하지 않으며 다른 사람들의 반응을 읽어 주시면 감사하겠습니다.

+0

이 상황에서 내 기본 접근 방식입니다. 일반적으로 Save() 이후의 업데이트는 서버 이벤트를 통해 트리거되므로 각 모델은 DTO 변경에 의해 트리거 된 변경 사항으로부터 자체를 업데이트 할 수 있습니다. –

0

다른 변형을 사용하여 많은 성공을 거뒀습니다. 우리에게는 실시간 GUI가 있었기 때문에 클라이언트에서 반복적 인 다시 그리기가 허용되지 않았습니다.

DTO가 속성 변경을 인식하고 PropertyChanged 이벤트를 ViewModel에 내보내 서버 측 이벤트를 재생했습니다.

코드는 쓰기 쉽고, 단위 테스트 등입니다. PropertyChangeListeners (ViewModels로 구현 된 인터페이스)을 입력하면 쉽게 찾아 볼 수 있습니다.

이 경계는 스레드를 GUI 작업자 스레드로 전환하는 데 사용될 수도 있습니다.

+1

나는이 일에 대해 걱정할 것입니다.DTO가 갖는 가치는 서비스 경계를 ​​넘어서 데이터를 전송하는 것과 관련하여 하나의 관심사가 있으며 그 목적에 맞게 최적화 될 수 있다는 것입니다. 메소드 없음, 매개 변수화 된 생성자 없음, 이벤트 없음 - 이는 도메인 객체/모델 관심사입니다. 도메인 객체를 DTO로 사용하는 WCF 프로젝트가 하나 있습니다. WCF가 속성 초기화를 사용하기 때문에 실행되지 않는 초기화 로직을 생성 할 때까지는 꽤 잘 작동했습니다. 이런 종류의 일은 우리의 DTO를 방해하는 바보 같은 영역에 대한 관심이 커지면서 그 반대가되었습니다. 수다. –

+0

내 특정 프로젝트가 운이 좋았다는 것을 알게되었습니다 ... DTO와 도메인 간에는 때때로 상충되는 요구 사항이 있지만 DTO 클래스 내에서 직교성을 유지할 수있었습니다. – louisgab