2013-02-19 17 views
5

Poszukuję najlepszej praktyki do komunikacji asynchronicznej między warstwami. Używam mvvm light toolkitco jest asynchroniczne w MVVM? Model lub ViewModel. Najlepsza praktyka?

obecnie używam BackgroundWorker w modelu bo widziałem ten kod wygenerowany automatycznie. Nie w tle, ale w asynchronicznym wywołaniu.

public void GetConfig(Action<Config, Exception> callback) 
{ 
    BackgroundWorker backgroundWorker = new BackgroundWorker(); 
    backgroundWorker.DoWork += (backgroundWorkerSender, backgroundWorkerArgs) => 
    { 
     try 
     { 
      backgroundWorkerArgs.Result = AppEnvironment.Instance.Config; 
     } 
     catch (Exception exception) 
     { 
      backgroundWorkerArgs.Result = null; 
     } 
    }; 

    backgroundWorker.RunWorkerCompleted += (backgroundWorkerSender, backgroundWorkerArgs) => 
    { 
     if (backgroundWorkerArgs.Result != null) 
     { 
      callback((Config) backgroundWorkerArgs.Result, null); 
     } 
     else 
     { 
      /* ToDo: exceptionhandling */ 
     } 
    }; 

    backgroundWorker.RunWorkerAsync(); 
} 

Teraz znalazłem AsyncDelegateCommand który implementuje asynchroniczny udział w ViewModel.

private ICommand _refreshObjectDefinitionCommand; 
public ICommand RefreshObjectDefinitionCommand 
{ 
    get 
    { 
     return _refreshObjectDefinitionCommand 
      ?? (_refreshObjectDefinitionCommand = new AsyncDelegateCommand(delegate 
       { 
        IsBusy = true; 
        _dataService.GetObjectDefinition(
        (xmlObjectDef, errorConfig) => 
        { 
         if (errorConfig != null) 
         { 
          /* ToDo Lenz: exceptionhandling */ 
          return; 
         } 

         ObjectDefinition = xmlObjectDef; 
        }); 

        _dataService.GetObjectDefinitionTreeView(
         (treenodes, errorConfig) => 
         { 
          if (errorConfig != null) 
          { 
           /* ToDo Lenz: exceptionhandling */ 
           return; 
          } 

          TreeNodes = treenodes; 
         }); 
       }, 
           () => _isConnected, o => IsBusy = false, exception => IsBusy = false)); 
    } 
} 

Jestem trochę zdezorientowany co do najlepszej praktyki? Czytałem dużo artykułów. Ale jakoś zawsze są to różne opinie. Czy istnieje jakiś przepis na najlepszą kompatybilność przy normalnym wysiłku, aby utrzymać?

Niektórzy do myślenia

Model:

http://csharperimage.jeremylikness.com/2009/12/simplifying-asynchronous-calls-in.html

http://www.dzone.com/articles/mvvmlight-and-async

ViewModel

http://www.codeproject.com/Articles/123183/Asynchronus-MVVM-Stop-the-Dreaded-Dead-GUI-Problem

http://www.codeproject.com/Articles/441752/Async-MVVM-Modern-UI

+0

Czy wzór zadania nie byłby łatwiejszy do odczytania? Z async/poczekaj .. – JustAnotherUserYouMayKnow

+0

oczywiście, ale o ile mi wiadomo, to tylko od .net 4.5 dostępne?!? –

+0

Istnieje pakiet NuGet do obsługi wersji 4.0 i silverlight 5. Zainstaluj go w swoim projekcie i działa jak urok! http://nuget.org/packages/Microsoft.CompilerServices.AsyncTargetingPack/ – JustAnotherUserYouMayKnow

Odpowiedz

1

Cóż, chciałbym powiedzieć fecthing modelu i przekształcenie go w widoku modelu jest asynchroniczny. Kto to robi, zależy od architektury, można to zrobić na samym modelu widoku lub może używać warstwy kontrolera do takich ładowań asynchronicznych i mapowania zainicjowanej maszyny wirtualnej do wyświetlenia. Również przeszłe prace to przeszłość, do której powinieneś użyć klasy Task dla operacji równoległych. I oczywiście nie zapomnij wywołać przez dispatchera, gdy powiadamia się o zmianie VM.

przykładowy kod:

Task<string>.Factory.StartNew(() => 
{ 
    string text = GetArticleText(); 
    Application.Current.Dispatcher.BeginInvoke(new Action(()=>MyTextProperty = text)); 
}); 
1

Proponuję wprowadzenie kodu asynchronicznego w ViewModel i zostawić swój model do przechowywania danych. Kiedy zaczynałem od MVVM, jedną z pierwszych rzeczy, których się nauczyłem, było usunięcie logiki z moich modeli i zachowanie jej w moich modelach ViewModels. Chociaż powiedziałbym, że umieszczenie kodu nie ma znaczenia, o ile wszyscy ludzie czytający kod mogą go zrozumieć.

Powiązane problemy