串行端口和MVVM

串行端口和MVVM,mvvm,serial-port,Mvvm,Serial Port,我试图在使用I/O时理解MVVM,特别是串行端口 我已经实现了我的MVVM模型,如下所示: 模型 我的问题是: 我应该在模型或ViewModel中实现诸如获取端口名、打开和关闭端口等方法吗 我读到模型应该只包含数据,而不是方法? 或者模型可以运行诸如打开COM端口之类的方法吗?我也不会使用它。模型应该包含有意义的数据,在这种情况下,这些数据将是从串行端口读取的数据。一个好的方法是创建一个对象,该对象抽象出您对目标设备的影响 假设您正在使用一个带有串行端口的数字秤。您可能希望方法读取当前权重并通过

我试图在使用I/O时理解MVVM,特别是串行端口

我已经实现了我的MVVM模型,如下所示:

模型

我的问题是: 我应该在模型或ViewModel中实现诸如获取端口名、打开和关闭端口等方法吗

我读到模型应该只包含数据,而不是方法?
或者模型可以运行诸如打开COM端口之类的方法吗?

我也不会使用它。模型应该包含有意义的数据,在这种情况下,这些数据将是从串行端口读取的数据。一个好的方法是创建一个对象,该对象抽象出您对目标设备的影响

假设您正在使用一个带有串行端口的数字秤。您可能希望方法读取当前权重并通过方法设置当前时间。这会将所有序列化和反序列化保持在一个位置,因此不会传递端口、原始字节或其他内容。以下是一个示例详细信息,省略了错误处理:

// Model
public class WeightReport 
{
    public float Weight { get; set; }

    public string Units {get; set; }        
}


// Port service
public class MyScale
{
    private SerialPort _port;

    public MyScale()
    { /* Setup port */ }


    public WeightReport ReadWeightReport()
    {
        var resp = _port.ReadBytes(/* however many bytes */);

        // or make a factory, static parser, whatever
        var report = new WeightReport(resp);

        return report;
    }
}

// ViewModel
public class MyViewModel
{
    private MyScale _scale;

    public WeightReport LastRead { get; set; }

    // Add events, delegates, background thread, methods etc. to update LastRead
}

当然,有很多方法可以做到这一点,这实际上取决于您的风格以及您对维护此应用程序的期望。

回答得好,仅仅因为您使用MVVM并不意味着这些是您的应用程序应该拥有的唯一层。对于SerialPort,我通常有一个硬件抽象层作为服务公开,然后通过依赖注入插入到需要的地方。这绝对是一个好办法。
// Model
public class WeightReport 
{
    public float Weight { get; set; }

    public string Units {get; set; }        
}


// Port service
public class MyScale
{
    private SerialPort _port;

    public MyScale()
    { /* Setup port */ }


    public WeightReport ReadWeightReport()
    {
        var resp = _port.ReadBytes(/* however many bytes */);

        // or make a factory, static parser, whatever
        var report = new WeightReport(resp);

        return report;
    }
}

// ViewModel
public class MyViewModel
{
    private MyScale _scale;

    public WeightReport LastRead { get; set; }

    // Add events, delegates, background thread, methods etc. to update LastRead
}