C# Silverlight构造函数注入视图模型&x2B;设计模式
我正在努力用Silverlight4编写可测试的视图模型。Im目前正在使用MVVM灯光 我用的是AutoFac,IoCContainer做得很好。但是,要注入绑定到视图的ViewModels的构造函数,我有以下构造函数链接:C# Silverlight构造函数注入视图模型&x2B;设计模式,c#,silverlight,silverlight-4.0,ioc-container,mvvm-light,C#,Silverlight,Silverlight 4.0,Ioc Container,Mvvm Light,我正在努力用Silverlight4编写可测试的视图模型。Im目前正在使用MVVM灯光 我用的是AutoFac,IoCContainer做得很好。但是,要注入绑定到视图的ViewModels的构造函数,我有以下构造函数链接: public UserViewModel() : this(IoCContainer.Resolve<IUserServiceAsync>()) { } public UserViewModel(IUserServiceAsy
public UserViewModel() : this(IoCContainer.Resolve<IUserServiceAsync>())
{
}
public UserViewModel(IUserServiceAsync userService)
{
if (this.IsInDesignMode) return;
_userService = userService;
}
public UserViewModel():这个(IoCContainer.Resolve())
{
}
公共用户视图模型(IUserServiceAsync用户服务)
{
如果(此.IsInDesignMode)返回;
_userService=userService;
}
虽然感觉不干净,但这是迄今为止我找到的最好的选择。这可以正常工作,我的应用程序也可以正常工作,并且可以通过控制反转进行测试
但是,当我的VM绑定到我的视图时,如下所示:
<UserControl.DataContext>
<ViewModel:UserViewModel />
</UserControl.DataContext>
public class ViewModelLocator
{
IoCContainer Container { get; set; }
public IUserViewModel UserViewModel
{
get
{
return IoCContainer.Resolve<IUserViewModel>();
}
}
}
在我的XAML页面属性中,VS2010和Blend中的设计模式都不起作用
有没有更好的方法来实现我在Silverlight中尝试的,仍然可以与设计模式一起工作的东西?失去设计模式并不是一个破坏者,但在学习XAML时会很方便。不过,一条干净的无锁链的路会很好
我想也许可以使用AutoFac/IoC将视图模型解析为视图,就像上面的XAML标记方法一样,并沿着这条路线走下去
谢谢。我建议您实现ViewModelLocator,而不是实现第一个构造函数,如下所示:
<UserControl.DataContext>
<ViewModel:UserViewModel />
</UserControl.DataContext>
public class ViewModelLocator
{
IoCContainer Container { get; set; }
public IUserViewModel UserViewModel
{
get
{
return IoCContainer.Resolve<IUserViewModel>();
}
}
}
然后在XAML中,您可以干净地使用资源:
<UserControl
DataContext="{Binding Path=UserViewModel, Source={StaticResource ViewModelLocator}}"
/>
<!-- The other user control properties -->
在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 -->
您可以使您的模拟视图模型定位器返回安全且易于读取的数据,以便混合使用,并且在运行时您将使用真正的服务
这样,您就不会丢失设计时数据,也不必牺牲视图模型中依赖项注入方法的清洁度
我希望这能有所帮助。谢谢您的详细回复!
<UserControl
d:DataContext="{Binding Path=UserViewModel, Source={StaticResource MockViewModelLocator}}"
DataContext="{Binding Path=UserViewModel, Source={StaticResource ViewModelLocator}}"
/>
<!-- The other user control properties -->