7

Tôi có một mô hình khung nhìn với một hàm tạo yêu cầu dịch vụ. Tôi đang sử dụng MvvmLight của GalaSoft trong đó sử dụng một định vị dịch vụ để kết nối khung nhìn với mô hình khung nhìn.Mô hình xem MVVM và khởi tạo dữ liệu không đồng bộ

SimpleIOC xử lý việc cung cấp dịch vụ cho trình tạo mô hình chế độ xem tốt, nhưng bằng cách nào đó tôi cần điền mô hình chế độ xem của mình với dữ liệu từ nguồn dữ liệu. My Viewmodel trông giống như sau: -

public class MainPageViewModel : ViewModelBase 
{ 
    private readonly GroupService _groupService; 
    private readonly GroupFactory _groupFactory; 
    private readonly ObservableCollection<GroupVM> _groupVms = new ObservableCollection<GroupVM>(); 


    public MainPageViewModel(Domain.Services.GroupService groupService, VMFactories.GroupFactory groupFactory) 
    { 
     _groupService = groupService; 
     _groupFactory = groupFactory; 
    } 

    public async Task Init() 
    { 
     var groups = await _groupService.LoadGroups(); 
     foreach (var group in groups) 
     { 
      GroupVms.Add(_groupFactory.Create(group)); 
     } 
    } 

    public ObservableCollection<GroupVM> GroupVms { get { return _groupVms; } } 
} 

Bằng cách nào đó phương pháp init cần được gọi là chờ đợi, nhưng tôi không biết cách tốt nhất để làm điều này? Tôi có thể nghĩ đến ba lựa chọn: -

  1. tôi chỉ cần gọi Init trên các nhà xây dựng, nhưng không phải chờ đợi nó (Tôi biết thats thực hành thực sự xấu)
  2. tôi gọi Init trên đối tượng ViewModelLocator, nhưng kể từ khi tôi không thể trả lại một nhiệm vụ Tôi lại không thể chờ đợi init
  3. Khi tải của chế độ xem, tôi truyền DataContext tới một số loại IAsyncViewmodel và chờ phương thức init.

Tôi đã sử dụng tùy chọn 3 trong dự án cửa sổ trước 8 cửa hàng nhưng nó chỉ cảm thấy sai. Bất kỳ lời khuyên nào sẽ được đánh giá cao!

Cảm ơn

Ross

Trả lời

7

Tôi tò mò tại sao bạn không xem xét việc gọi điện thoại không đồng bộ là một hành động không tốt. Theo tôi, nó không phải là xấu miễn là bạn biết điều đó có nghĩa là, cuộc gọi sẽ được thực hiện trong nền và có thể trở lại bất cứ lúc nào.

Thông thường những gì tôi làm là tôi gọi phương thức không đồng bộ trong hàm tạo cho mục đích tạo dữ liệu thời gian thiết kế và tôi không chờ đợi nó. Tôi chỉ quan tâm đến việc nâng cao các sự kiện PropertyChanged và CollectionChanged khi cần thiết cho các ràng buộc được cập nhật, và điều đó thực hiện điều đó.

Cheers Laurent

+0

Điểm tốt, đó là "một trong những" điều tôi đã thực hiện nhưng không thực sự nghĩ đến. Ở đây có thêm một chút thông tin về: http://stackoverflow.com/questions/7261173/c-sharp-start-async-method-within-object-constructor-bad-practice Về cơ bản đó là vì khi đối tượng được xây dựng thì nó vẫn là " làm công cụ "có lẽ bất ngờ, cộng thêm rất khó để xử lý các ngoại lệ có thể xảy ra. Tôi đã thử cả hai cách, và tôi nghĩ rằng tôi thích init trong constructor, nhưng vẫn không chắc chắn! –

+0

mẹo: để tránh 'squigglies' trong Visual Studio chỉ cần gán giá trị của tác vụ trả về cho biến giả –

1

Tôi không phải là quen thuộc với MvvmLight như tôi từng là, nhưng tôi đã cố gắng để đối phó với async nhà xây dựng trong nhiều cách khác nhau.

Tùy chọn (1) có lỗi xử lý phức tạp. Tùy chọn (3) buộc InitAsync truy cập được.

tôi thích một cách tiếp cận async nhà máy (ví dụ, tùy chọn (2), nơi DataContext sẽ ở lại cho đến khi null khởi VM hoàn thành), nhưng nó có vẻ như ViewModelLocator sẽ không hoạt động cho điều đó. Vì vậy, (bây giờ) bạn phải lựa chọn giữa một nhà máy async không sử dụng IoC và một trong các tùy chọn khác (1 hoặc 3) không lý tưởng.

Cá nhân, tôi sẽ loại bỏ IoC cho liên kết VM/View (tôi chưa bao giờ sử dụng IoC cho điều đó; lượt xem của tôi phụ thuộc vào máy ảo của tôi) và sử dụng phương pháp nhà máy async. Tuy nhiên, các tùy chọn khác là hoàn toàn khả thi nếu bạn muốn ở lại với IoC. Đối với máy ảo, tôi nghĩ rằng tùy chọn (1) sẽ tốt hơn một chút so với tùy chọn (3) nếu bạn luôn có một mức cao nhất try/catch trong các phương pháp InitAsync của mình.

+0

Cảm ơn, tôi sẽ để lại những câu hỏi mở để lâu hơn một chút như tôi muốn nghe ý kiến ​​nhân dân ý kiến ​​khác về vấn đề này. –

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