2015-07-10 79 views
3

我正在尝试开发一个小程序,它将与串口上的设备进行通信。该程序将负责格式化用户输入的数据以及读取和显示设备接收的值。我对WPF和MVVM相当陌生,并且已经对整个数据绑定/ XAML混乱(我认为)有了基本的了解。C#MVVM服务层在哪里坐?

目前我的理解去是这样的:

  1. 查看:UI唯一的东西。绑定到ViewModel。
  2. ViewModel:采用模型或模型的各种属性,并以View可以理解的方式呈现它们。还为视图修改模型提供了一种方法。
  3. 型号:UI呈现和修改的数据。

现在我不知道是什么向ViewModel提供了模型,以至于整个应用程序都知道模型的变化。

该模型目前看起来如下所示。我的设备获取校准记录并可以读回所有校准记录。

public class Device : ObservableObject 
{ 
    public ObservableCollection<CalibRecord> CalibRecords { get; set; } 

    private SerialPort sp; 

    public Device(SerialPort port) 
    { 
     this.sp = port; 
     this.CalibRecords = new ObservableCollection<CalibRecord>(); 
    } 

    public void WriteCalibration(CalibRecord record) 
    { 
     /* Write a calibration record to the device */ 
    } 

    public void ReadCalibration() 
    { 
     /* Read all calibration records from the device and update CalibRecords */ 
    } 
} 

我正在努力让一个地方放这个家伙,让它可以被整个应用程序访问。目前我在主窗口的ViewModel中实例化了它,但是除非我将其注入到构造函数中,否则它不能被其他ViewModel访问。对于一对夫妇来说这很好,但是ViewModel需要的类越多,它就会很快变得笨拙。

也许这就是所谓的“业务逻辑”或“服务层”。你能帮我理解在MVVM应用程序中放置业务逻辑的位置吗?或者,你们是否有一些我应该关注的例子,主要关注整个应用程序(特别是业务逻辑),而不仅仅是MVVM的东西?

+0

就我个人而言,我会在您的解决方案中使用一些接口创建一个服务层(项目),以促进依赖注入到使用服务功能的应用程序区域,同时这也简化了服务的单元测试。 – Shawn

回答

4

您对MVVM的理解是正确的,但“教科书描述”并未考虑服务。通常这是通过依赖注入(DI)完成的。定义一个接口,IMyDevice并在MyDevice类中实现它。然后将其注册到您的DI容器IMyDevice - > MyDevice。通过使用DI容器(正确使用),您还可以摆脱虚拟现实施工图片。你将有一个VM是这样的:

public class MyViewModel : ViewModelBase 
{ 
    public MyViewModel(IMyDevice myDevice) 
    { 
    } 
} 

得到VM的一个实例,你会怎么做:

theDIContainer.Resolve<MyViewModel>(); 

,它将新了MyViewModel类,并自动解决,并通过在IMyDevice实例为你。

DI还有很多,然后我在这里覆盖......只是一个基本的10,000英里高的答案你的问题。阅读DI并了解它如何与MVVM一起发挥作用。