2012-06-28 3 views
0

MVVMLight를 사용하여 MVVM Silverlight 응용 프로그램을 코딩하고 있습니다. Model과 ViewModel 사이에서 통신하는 가장 좋은 방법은 무엇인지 스스로에게 묻고있었습니다. 내 모델은 웹 서비스에서 비동기 호출을 가지고 있으며 반환 값을 얻는 가장 좋은 방법은 무엇인지 알지 못합니다. 나는 MvvmLight 메신저를 사용하고 있습니다 첫 번째 예에서,ViewModel과 모델간에 비동기 호출을 교환하는 방법

public static void ModifySomething(Something s, Action<Something, Exception> callback) 
{ 
    var c = ServiceFactory.RecupererService(); 
    c.ModifySomethingCompleted += (sender, e) => 
    { 
     if (callback != null) callback(e.Result, e.Error); 
    }; 
    c.ModifySomethingAsync(s); 
} 

두 작품, 그래서를 등록해야 :

public static void ModifySomething(Something s) 
{ 
    var c = MyServiceFactory.GetService(); 
    c.ModifySomethingCompleted += (sender, e) => 
    { 
     if (e.Error != null) 
     { 
      Messenger.Default.Send(new XyzException(e.Error, "ModifyError")); 
      return; 
     } 
     Messenger.Default.Send(e.Result, "ModifyOk"); 
    }; 
    c.ModifySomethingAsync(s); 
} 

이를 :

나는이 시도했다 내 모델의 모든 메소드에 대한 문자열 메시지 목록. 그러면 모든 ViewModel이이 작업에 연결할 수 있습니다.

두 번째 예에서는 고전적인 방법을 사용하여 Completed 이벤트에서 발생하는 콜백을 보냅니다. 하나의 콜백 만 실행되지만 코드는 훨씬 더 읽기 쉽습니다.

최상의 접근 방법은 무엇입니까?

+0

비동기 호출은 어떻게 처리됩니까? –

+0

비동기 메서드는 서비스 참조 (코드는 wsdl 파일에서 자동 생성 됨)에서 호출되며 모델 부분의 정적 메서드에서 호출됩니다. –

답변

1

나는 말하고 싶다 : 의존한다! 진심으로! 그것은 당신이 (좋은 디자인, 확장 성 등)을 달성하고자하는 것을

  • 에 따라
  • 당신이 원하는 대상 환경이
  • 얼마나 많은 사람들에 최선을 다하고 있습니다 원하는 것을
  • 을 수행하는 데 사용되는 것을
  • 프로젝트
  • estd. 1.000 항목 이상

나는 서비스 버스 같은 동작을 제공하고 원하는 경우 구성을 사용할 수 있기 때문에 첫 번째 접근 방식을 좋아합니다. 두 번째는 메시지를 게시하는 중에 오류를 만들 수 있으므로 유형 안전 측면에서보다 구체적입니다.

+0

그래도 내 첫 번째 접근 방식이었습니다. 메시지를 일치시키는 데 상수를 사용하고 있습니다. 그러나 애플리케이션이 많아 질수록 메시지가 많을수록 나쁜 코드 디자인이 아닐 것이라고 확신 할 수 있습니다. 감사! –

관련 문제