2010-10-27 100 views
10

我試着去抓住與目前使用MVVM光在Silverlight 4,我寫可驗證的ViewModels。Silverlight的構造函數注入視圖模型+設計模式

進出口使用AutoFac和IoCContainer正在做它的工作的罰款。然而,爲了注入的ViewModels,這必將對瀏覽我的這個構造鏈的構造:

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

    } 

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

     _userService = userService; 
    } 

這並不感到乾淨,但到目前爲止,我已經找到了最好的選擇。這工作和我的應用程序按需工作,並與控制倒置測試。

然而,我的虛擬機綁定到我的看法是這樣的:

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

在我的XAML頁面屬性,設計模式都VS2010和混合不起作用。

是否有更好的方式來實現什麼即時在Silverlight仍然與設計模式下工作努力?失去設計模式並不是一個難題,但在學習XAML時會很方便。一個清潔沒有鏈方式將是很好,但!

林認爲它也許可以使用AutoFac /國際奧委會解決的ViewModels到的意見,並列爲對XAML標記的辦法以上,並沿着這條路走下去?

謝謝。

回答

10

無需實現第一個構造函數的,我建議你實現一個ViewModelLocator,像這樣:

public class ViewModelLocator 
{ 

    IoCContainer Container { get; set; } 

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

} 

然後在XAML中聲明的定位爲靜態資源:

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

當你初始化你的應用程序中,有必要提供定位與容器的實例:

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

然後在XAML可以乾淨地使用資源:

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

對於設計時間,你可以實現一個MockViewModelLocator:

public class MockViewModelLocator 
{ 

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

} 

在XAML中聲明它適當:

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

而且最終在您的用戶控制中使用它:

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

您可以讓您的模型視圖模型定位器返回安全且易讀的數據,供Blend使用,並且在運行時您將使用您的真實服務。

這樣,您就不會失去設計時間數據和你不必犧牲依賴注入的方法的清潔您的視圖模型。

我希望這會有所幫助。

+0

感謝您的詳細回覆! – Jammin 2010-10-27 17:38:46