SerialPort и MVVM - PullRequest
       1

SerialPort и MVVM

0 голосов
/ 31 октября 2018

Я пытаюсь понять MVVM при использовании ввода-вывода, в частности последовательного порта.

Я реализовал свою модель MVVM следующим образом:

Модель

public class SerialPortModel
{
    private SerialPort Port;

    public SerialPortModel()
    {
        Port = new SerialPort
        {
            Handshake = Handshake.None,
            BaudRate = 9600,
            ReadTimeout = 400,
            DiscardNull = false,
            ReceivedBytesThreshold = 1,
            WriteTimeout = 100
        };
    }
}

Мой вопрос: Должен ли я реализовать такие методы, как получение имен портов, открытие и закрытие портов и т. Д. В модели или во ViewModel?

Я читал, что Модель должна содержать данные, а не методы? Или это нормально, что Модель запускает такие методы, как открытие COM-порта?

1 Ответ

0 голосов
/ 04 ноября 2018

Я бы тоже не использовал его. Модель должна содержать значимые данные, которые в этом случае будут данными, которые вы читаете из последовательного порта. Хороший подход заключается в создании объекта, который абстрагирует то, на что вы воздействуете, на целевом устройстве.

Допустим, вы работаете с одним из цифровых весов с последовательным портом. Вы хотите, чтобы методы считывали текущий вес и устанавливали текущее время с помощью методов. Это сохраняет всю вашу сериализацию и десериализацию в одном месте, чтобы вы не передавали порт, необработанные байты или другие вещи. Вот пример (подробности, обработка ошибок исключена):

// 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
}

Конечно, есть много способов сделать это, и это действительно зависит от вашего стиля и от того, сколько вы ожидаете от этого приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...