2010-10-27 74 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