Serialport и mvvm

Я пытаюсь понять 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
        };
    }
}

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

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

0
0
728
1

Ответы 1

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

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

// 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 у меня обычно есть уровень аппаратной абстракции, представленный как сервис, который затем вставляется туда, где это необходимо, посредством внедрения зависимостей.

Mark Feldman 05.11.2018 03:16

Спасибо и хорошее упоминание DI. Это абсолютно правильный путь.

cory.todd 05.11.2018 15:16

Другие вопросы по теме