Csharp/C#教程:Silverlight构造函数注入视图模型+设计模式分享


Silverlight构造函数注入视图模型+设计模式

我试图在Silverlight 4中编写可测试的ViewModel。我正在使用MVVM灯。

我使用AutoFac和IoCContainer正在完成它的工作。 但是要注入ViewModel的构造函数,它绑定到Views我有这个构造函数链接:

public UserViewModel() : this(IoCContainer.Resolve()) { } public UserViewModel(IUserServiceAsync userService) { if (this.IsInDesignMode) return; _userService = userService; } 

哪个不干净,但是到目前为止我找到的最佳选择。 这是有效的,我的应用程序可以根据需要工作,并且可以通过控制倒置来测试

但是,我的VM绑定到我的视图,如下所示:

     

在我的XAML页面属性中,VS2010和Blend中的设计模式都不起作用。

是否有更好的方法来实现我在Silverlight中尝试仍然适用于设计模式的东西? 失去设计模式不是一个交易破坏者,但在学习XAML时会很方便。 一个更干净的无链接方式会很好!

我认为可以使用AutoFac / IoC将视图模型解析为视图,就像上面的XAML标记方法一样,并沿着这条路走下去?

谢谢。

我建议您实现一个ViewModelLocator,而不是实现第一个构造函数,如下所示:

 public class ViewModelLocator { IoCContainer Container { get; set; } public IUserViewModel UserViewModel { get { return IoCContainer.Resolve(); } } } 

然后在XAML中将定位器声明为静态资源:

  

在初始化应用程序时,必须为定位器提供容器的实例:

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

然后在XAML中,您可以干净利用资源:

   

在设计时,您可以实现MockViewModelLocator:

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

适当地在XAML中声明它:

  

最后在用户控件中使用它:

   

您可以使模拟视图模型定位器返回安全且易于读取的数据供Blend使用,并且在运行时您将使用您的真实服务。

这样您就不会丢失设计时数据,也不必牺牲视图模型中dependency injection方法的清洁度。

我希望这有帮助。

上述就是C#学习教程:Silverlight构造函数注入视图模型+设计模式分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1003925.html

(0)
上一篇 2021年12月28日
下一篇 2021年12月28日

精彩推荐