2010-11-19 4 views
23

내 뷰 모델 클래스에는 서비스에 연결하는 메서드가 있습니다 (모범 사례인지 확실하지 않거나 뷰 모델이 엄격하게 속성 및 속성 변경 메커니즘으로 간주되는 경우). 물론 연결하거나 연결을 끊을 때 발생할 수있는 WCF 예외를 처리하고 싶습니다.MVVM에서 어디에서 예외를 잡을 수 있습니까?

예를 들어 사용자가주의를 끌기를 원한다는 점을 고려하여 예를 들어 설명하지 않는 엔드 포인트를 사용합시다.

public void Connect() 
{ 
    ServiceClient proxy = null; 
    try 
    { 
     proxy = new ServiceClient(); 
     proxy.Subscribe(); 
     // ... 
    } 
    catch(EndpointNotFoundException) 
    { 
     // should I do something here? 
    } 
    // .. other WCF related exception catches and a finally 
} 

는 내가 예외가 나의 WPF 응용 프로그램의 또 다른 층을 잡는다 어쩌면 다시 throw 어쩌면 캐치에서 직접) System.Windows.MessageBox.Show를 (호출하는 좋은 습관을 고려하거나해야인가 : 거친 코드 예제를 고려 ? 그렇다면 그러한 예외를 잡을 수있는 이상적인 곳은 어디입니까?

+0

사용자가이 예외에 대해 정확히 무엇을 의미합니까? 이 예외를 올바르게 "처리"하기 위해 사용자에게 필요한 것을 알려 주어야합니다. 사용자가 아무 것도 할 수 없다면 사용자에게 예외를 말하지 마십시오. "미안하지만 뭔가 잘못되었습니다". –

+1

@ 존, 사용자는 세상을 구할 필요가 없습니다. 먼 쪽 끝을 사용할 수 없다는 것을 사용자에게 보여줘야합니다. 그것이 내가 MessageBox를 언급하는 이유입니다. 이 질문은 내가 사용자에게 무엇을 말해야하는지에 관한 것이 아니라, 내가 사용하고있는 패턴에서 예외를 우아하게 처리하는 방법을 알고 싶다. – jlafay

+0

이 방식으로 WCF 오류를 처리합니다. [MSDN] (http://msdn.microsoft.com/en-us/library/dd470096%28VS.96%29.aspx) – Gabe

답변

27

예외를 잡아 내고 ViewModel이 무엇이든 ErrorViewModel 속성으로 래핑하여 예외를 처리했습니다.

ViewModel 이 EndpointNotFoundException을 포착한다고 가정 해 봅니다. 이 오류를 표현하기 위해 나는 ErrorViewModel에서 Exception을 랩핑하고 A의 Error 속성에 할당했다.

와 관련된보기 의 오류 속성에 바인딩 ContentControl이 포함되어 있습니다. 한편 DataTemplate을 사용하여 ErrorViewModel에 오류보기를 연결합니다. 해당보기에서 Visibility의 Error 속성에 예외가 포함되어 있는지 여부에 따라 결정됩니다.

그래서 의보기는 예외가 잡힐 때 표시되며, 오류 메시지에 OK 버튼을보기 (A)에 명령을 호출 (사용자에 의해 기각 할 수있는 오류 메시지보기를 포함의 Error 속성을 지우므로 오류 메시지보기의 가시성을 Collapsed으로 변경합니다.

지금까지는 적절한 MVVM 디커플링을 유지하는 좋은 방법 인 것으로 보입니다.

희망이 있습니다. 한 가지 방법 또는 다른 방법, 솔직히, 나는 WPF 애플 리케이션에서 순수하게 최후의 수단으로 System.Windows.MessageBox.Show()을 고려할 것입니다. 왜 그 옛것에 찬성하여 UI를 풍성하게 통제합니까? 여기에 대해서는 another popup-implementation approach입니다.

+0

나는 MessageBox가 최후의 수단이 될 것이라고 생각했다. (비밀리에 그렇게 바라고). – jlafay

+2

나는이 접근 방식을 좋아한다. 시각화 할 수있는 상태를 표현하는 것은 ViewModel의 역할입니다. 따라서 모델의 어딘가에서 발생한 오류는 뷰에 '밀어 넣기'해서는 안됩니다. 오히려, ViewModel의 상태는 오류가 있음을 반영해야합니다. 또한 다양한 소스에서 오류 상태를 노출시키는 중앙 집중식 메커니즘을 사용하여 오류를 일부 ErrorDisplayService까지 전파하는 것을 볼 수 있습니다. –

+0

나는 이것을 아주 좋아한다. 내가 당신을 이해한다면, 당신은 사용자에게 표시 될 어떤 오류로 "나는 다른 끝까지 도달 할 수 없다"는 것을 의미하는 예외를 추출 할 것입니다. 저건 완벽 해. 이것이 API 였다면, 나는 다른 쪽에서 "예외적으로 접근 할 수 없다"라는 예외를 배치 할 것을 제안했을 것입니다. –

관련 문제