c# MVVM服务层在哪里?

本文关键字:在哪里 服务 MVVM | 更新日期: 2023-09-27 18:02:14

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

目前我的理解是:

  1. 视图:仅UI的东西。绑定到ViewModel。
  2. ViewModel:获取一个模型或模型的各种属性,并以视图可以理解的方式呈现它们。还为视图提供了一种修改模型的方法。
  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的东西?

c# MVVM服务层在哪里?

您对MVVM的理解是正确的,但是"教科书描述"没有考虑到服务。这通常是通过依赖注入(DI)完成的。定义一个接口,并在MyDevice类中实现它。然后将它注册到您的DI容器IMyDevice -> MyDevice。通过使用DI容器(正确地),您还可以将自己从VM构建图中解脱出来。你会有一个像这样的VM:

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

获取虚拟机的实例,您可以这样做:

theDIContainer.Resolve<MyViewModel>();

,它会新建MyViewModel类,并自动解析并为你传递IMyDevice实例。

还有更多的DI比我在这里介绍…只是对你问题的一个基本的一万英里高的回答。阅读DI,看看它是如何在MVVM中发挥作用的。

MVVM的思想是以松耦合的方式分离层,允许每一层在不干扰其他层的情况下进行修改和测试。

您测试ViewModel并模拟模型。测试模型。你的模型可以采用由一些DI容器自动注入的几个服务的形式。随后,模型和视图模型之间的摩擦尽可能少。最终,它们可能会独立部署;这降低了维护和成本;这和微服务的心态是一样的。

例如,你可能有一个经过测试的模型,可以用于WPF应用程序、移动应用程序、web应用程序等。然而,您的ViewModel不应该先验地参与到另一个GUI中。你可以更新你的web应用,而不需要提交/部署另一个和模型;

当你开始使用内聚类并测试它们时,在哪里放什么就很清楚了。

只有一个视图和一个ViewModel是可以的;尽管如果模型足够丰富,它应该具有业务逻辑;你应该对模型进行测试,对ViewModel (UI行为)进行测试。VM和Model层可以比仅仅2个类复杂得多,你可以有多个(自动)依赖注入(查看。net 中优秀的依赖注入,Mark Seemann)。

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

关于WPF,视图采用UserControl的形式,View.xaml(你看到的)和View.xaml.cs (代码后面);不是所有的UI逻辑都进入ViewModel;纯视图逻辑进入代码隐藏。隐藏代码特别包含所有依赖属性、行为逻辑(与xaml代码共享)等。