C#MVVM服务层位于何处?

时间:2015-07-10 22:11:57

标签: c# wpf mvvm

我正在尝试开发一个与串口上的设备通信的小程序。该程序将负责格式化用户输入的数据以及读取和显示设备接收的值。我是WPF和MVVM的新手,已经对整个数据绑定/ XAML混乱有了基本的了解(我认为)。

目前我的理解如下:

  1. 查看:只有UI的东西。绑定到ViewModel。
  2. ViewModel:获取模型的模型或各种属性,并以View可以理解的方式呈现它们。还为视图提供了修改模型的方法。
  3. 模型:UI呈现和修改的数据。
  4. 现在我不知道是什么为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需要的类越多,就会越快笨拙。

    也许这就是所谓的商业逻辑&#34;或者&#34;服务层&#34;是。你能帮我理解把业务逻辑放在MVVM应用程序的哪个位置吗?或者,您是否有一些我应该关注的示例,重点关注整个应用程序(尤其是业务逻辑)而不仅仅是MVVM的东西?

2 个答案:

答案 0 :(得分:4)

您对MVVM的理解是正确的,但&#34;教科书描述&#34;没有考虑到服务。通常,这是通过依赖注入(DI)完成的。定义一个接口,IMyDevice并在MyDevice类中实现它。然后将其注册到您的DI容器IMyDevice - &gt;我的设备。通过使用DI容器(正确),您也可以将自己从VM构建图片中取出。你会有一个像这样的虚拟机:

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

要获取VM的实例,您可以这样做:

theDIContainer.Resolve<MyViewModel>();

它将新建MyViewModel类并自动解析并传入IMyDevice实例。

DI还有更多内容,我在这里介绍......只需要一个基本的10,000英里高的答案来回答你的问题。阅读DI,了解它如何与MVVM发挥作用。

答案 1 :(得分:0)

MVVM的思想是以松散耦合的方式分离各层,从而允许对每一层进行修改和测试,而不会互相干扰。

您测试ViewModel并模拟模型。您测试模型。您的模型可能采取由某些DI容器自动注入的几种服务的形式。随后,视图模型之间的摩擦尽可能小。最终,它们可以独立部署;这降低了维护和成本;这与微服务的心态相同。

例如,您可能具有经过测试的模型,并且可以用于WPF应用程序,移动应用程序,Web应用程序等。但是,您的ViewModel不应先验包含在另一个GUI中。 您可以更新Web应用程序,而无需提交/部署其他应用程序和模型;成本更低,持续时间更低的承诺部署(包括测试)。

从内聚性类开始并对其进行测试时,很清楚在何处放置内容。

只有一个View和一个ViewModel是可以的;如果模型足够丰富,则应该具有业务逻辑;您应该对模型进行测试,对ViewModel进行测试(UI的行为)。 VM和模型层可能比仅2个类复杂得多,您可能需要进行多个(自动)依赖项注入(请检查.NET中出色的 Dependency Injection ,Mark Seemann)。

随后,(针对您的业务)逻辑应放在模型中,而不是在ViewModel中; UI的逻辑应该放在VM中。

关于WPF,视图采用带有View.xaml(您看到的内容)和View.xaml.cs隐藏代码)的UserControl形式;并非所有的UI逻辑都进入ViewModel;纯View逻辑包含在代码隐藏中。后面的代码特别包含所有dependency properties,行为逻辑(与xaml代码共享)等。