2013-02-19 32 views
5

Tôi đang tìm cách thực hành tốt nhất để giao tiếp không đồng bộ giữa các lớp. Tôi đang sử dụng mvvm light toolkitnhững gì là không đồng bộ trong MVVM? Mô hình hoặc ViewModel. Thực hành tốt nhất?

hiện tại tôi đang sử dụng một nền tảng trong mô hình vì tôi thấy điều này trong mã được tạo tự động. Không phải với nhân viên nền mà là cuộc gọi không đồng bộ.

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(); 
} 

Bây giờ tôi đã tìm thấy AsyncDelegateCommand thực hiện phần không đồng bộ trong 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)); 
    } 
} 

Tôi hơi bối rối về thực tiễn tốt nhất? Tôi đã đọc rất nhiều bài báo. Nhưng bằng cách nào đó họ luôn là những ý kiến ​​khác nhau. Có bất kỳ điều khoản nào cho khả năng tương thích tốt nhất theo nỗ lực bình thường để duy trì không?

Một số thực phẩm cho các tư tưởng

mẫu:

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

Sẽ không phải là cách nhiệm vụ dễ đọc hơn? Với async/await .. – JustAnotherUserYouMayKnow

+0

tất nhiên, nhưng theo như tôi biết nó chỉ là kể từ .net 4.5 có sẵn?!? –

+0

Có một gói NuGet để hỗ trợ nó cho 4.0 và silverlight 5. Cài đặt nó vào dự án của bạn và nó hoạt động giống như một sự quyến rũ! http://nuget.org/packages/Microsoft.CompilerServices.AsyncTargetingPack/ – JustAnotherUserYouMayKnow

Trả lời

1

Vâng, tôi sẽ nói rằng fecthing của mô hình và biến nó thành dạng xem là không đồng bộ. Ai làm điều đó, phụ thuộc vào kiến ​​trúc, nó có thể được thực hiện trên chính mô hình khung nhìn hoặc nó có thể sử dụng lớp điều khiển cho các tải up không đồng bộ và ánh xạ của VM khởi tạo để xem. Ngoài ra các nền tảng là quá khứ bạn nên sử dụng lớp Task cho các hoạt động song song. Và tất nhiên đừng quên gọi thông qua dispatcher khi thông báo quan điểm về những thay đổi từ VM.

mẫu Mã số:

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

tôi sẽ đề nghị đặt mã không đồng bộ trong ViewModel của bạn và để lại Model của bạn để lưu trữ các dữ liệu. Khi tôi bắt đầu MVVM, một trong những điều đầu tiên tôi học được là loại bỏ logic từ các Mô hình của tôi và thay vào đó giữ nó trong ViewModels của tôi. Mặc dù tôi sẽ nói rằng nơi bạn đặt mã của bạn không quan trọng miễn là tất cả những người đọc mã có thể hiểu được nó.

Các vấn đề liên quan