C# MVVM 服务层在哪里?

thn*_*rks 6 c# wpf mvvm

我正在尝试开发一个小程序,它将与串行端口上的设备进行通信。该程序将负责格式化用户输入的数据以及读取和呈现设备接收到的值。我对 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 */
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在努力寻找一个放置这个人的地方,以便整个应用程序都可以访问它。目前我在主窗口的 ViewModel 中实例化了它,但是除非我将它注入到构造函数中,否则其他 ViewModel 无法访问它。这对于几个类来说很好,但是随着 ViewModel 需要的类越多,它就会变得笨拙。

或许这就是所谓的“业务逻辑”或“服务层”。您能帮我理解将业务逻辑放在 MVVM 应用程序的什么位置吗?或者,你们有没有一些我应该看的例子,重点是整个应用程序(特别是业务逻辑),而不仅仅是 MVVM 的东西?

Sle*_*mer 6

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

public class MyViewModel : ViewModelBase
{
  public MyViewModel(IMyDevice myDevice)
  {
  }
}
Run Code Online (Sandbox Code Playgroud)

要获取 VM 的实例,您可以执行以下操作:

theDIContainer.Resolve<MyViewModel>();
Run Code Online (Sandbox Code Playgroud)

它会更新 MyViewModel 类并自动为您解析和传递 IMyDevice 实例。

DI 还有更多内容,然后我在这里介绍...只是对您的问题的基本 10,000 英里高答案。阅读 DI 并了解它如何与 MVVM 一起发挥作用。