2010-10-27 6 views
10

Tôi đang cố gắng nắm bắt bằng cách viết các mẫu ViewModels có thể kiểm tra trong Silverlight 4. Im hiện đang sử dụng ánh sáng MVVM.Tiêm xây dựng Silverlight vào View Model + Design Mode

Im sử dụng AutoFac và IoCContainer đang hoạt động tốt. Tuy nhiên để tiêm vào constructor của ViewModels, mà đang bị ràng buộc để xem tôi có constructor này chaining:

public UserViewModel() : this(IoCContainer.Resolve<IUserServiceAsync>()) 
    { 

    } 

    public UserViewModel(IUserServiceAsync userService) 
    { 
     if (this.IsInDesignMode) return; 

     _userService = userService; 
    } 

Mà không cảm thấy sạch sẽ, nhưng là lựa chọn tốt nhất tôi đã tìm thấy cho đến nay. Tính năng này hoạt động và ứng dụng của tôi hoạt động như mong muốn và có thể kiểm tra bằng điều khiển ngược.

Tuy nhiên, với VM của tôi bị ràng buộc vào quan điểm của tôi như thế này:

<UserControl.DataContext> 
      <ViewModel:UserViewModel /> 
</UserControl.DataContext> 

Trong các thuộc tính trang XAML của tôi, chế độ thiết kế ở cả VS2010 và Blend doesnt làm việc.

Có cách nào hay hơn để đạt được những gì bạn đang thử trong Silverlight vẫn hoạt động với chế độ thiết kế không? Mất chế độ thiết kế không phải là một bộ ngắt giao dịch nhưng sẽ thuận tiện trong khi học XAML. Một cách sạch sẽ không có chuỗi nào sẽ tốt đẹp mặc dù!

Tôi nghĩ có thể sử dụng AutoFac/IoC để giải quyết chế độ xem cho chế độ xem, như được áp dụng cho phương pháp đánh dấu XAML ở trên và đi xuống tuyến đường này?

Cảm ơn.

Trả lời

10

Thay vì thực hiện các nhà xây dựng đầu tiên, tôi khuyên bạn nên thực hiện một ViewModelLocator, như thế này:

public class ViewModelLocator 
{ 

    IoCContainer Container { get; set; } 

    public IUserViewModel UserViewModel 
    { 
     get 
     { 
      return IoCContainer.Resolve<IUserViewModel>(); 
     } 
    } 

} 

Sau đó, trong XAML bạn khai báo định vị như một nguồn lực tĩnh:

<local:ViewModelLocator x:Key="ViewModelLocator"/> 

Trong khi bạn khởi tạo ứng dụng của bạn, cần cung cấp trình định vị với bản sao của vùng chứa:

var viewModelLocator = Application.Current.Resources["ViewModelLocator"] as ViewModelLocator; 
if(viewModelLocator == null) { // throw exception here } 
viewModelLocator.Container = IoCContainer; 

Sau đó, trong XAML bạn có thể sử dụng tài nguyên sạch:

<UserControl 
    DataContext="{Binding Path=UserViewModel, Source={StaticResource ViewModelLocator}}" 
    /> 
    <!-- The other user control properties --> 

Đối với thời gian thiết kế, bạn có thể thực hiện một MockViewModelLocator:

public class MockViewModelLocator 
{ 

    public IUserViewModel UserViewModel 
    { 
     get 
     { 
      return new MockUserViewModel(); 
     } 
    } 

} 

Khai báo nó trong XAML một cách thích hợp:

<local:MockViewModelLocator x:Key="MockViewModelLocator"/> 

Và cuối cùng sử dụng nó trong điều khiển người dùng của bạn:

<UserControl 
    d:DataContext="{Binding Path=UserViewModel, Source={StaticResource MockViewModelLocator}}" 
    DataContext="{Binding Path=UserViewModel, Source={StaticResource ViewModelLocator}}" 
    /> 
    <!-- The other user control properties --> 

Bạn có thể làm cho trình định vị mô hình chế độ xem giả của bạn trả về dữ liệu an toàn và dễ đọc cho Blend để sử dụng và trong thời gian chạy, bạn sẽ sử dụng dịch vụ thực của mình.

Bằng cách này bạn không bị mất dữ liệu thời gian thiết kế và bạn không phải hy sinh sự sạch sẽ của phương pháp tiêm phụ thuộc trong các mô hình khung nhìn của bạn.

Tôi hy vọng điều này sẽ hữu ích.

+0

Cảm ơn bạn đã trả lời chi tiết! – Jammin