簡體   English   中英

SerialPort 類的依賴注入

[英]Dependency injection for SerialPort class

我想刪除對SerialPort類的依賴項並改用依賴項注入。 但我不知道該使用哪個接口。 SerialPort實現了ICommand ,但是如果我使用這個接口,我就不能使用SerialPort方法。

這是我的代碼:

private readonly SerialPort _serialPort;

public CommandService(string comPort)
{
    _serialPort = new SerialPort(comPort, 9600, Parity.None, 8, StopBits.One) { Handshake = Handshake.None };
    try
    {
        _serialPort.Open();
    }
    catch (System.IO.FileNotFoundException)
    {
        throw new Exception($"Serialport { comPort } can't be found");
    }
    _serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
}

public void Dispose()
{
    _serialPort.Close();
}

不幸的是, SerialPort沒有接口。 如果你想在依賴注入中使用它,你必須創建自己的接口和一個實現它的類。 這個類只是 .NET 的SerialPort類的包裝器:

public class SerialPortWrapper : ISerialPortWrapper
{
    private readonly SerialPort port;

    public SerialPortWrapper(SerialPort port)
    {
       this.port = port;
    }

    public void Open()
    {
       port.Open();
    }

    public string ReadLine()
    {
       return port.ReadLine();
    }

    public void WriteLine(string line)
    {
       port.WriteLine();
    }
}

public interface ISerialPortWrapper
{
   void Open();
   string ReadLine();
   WriteLine(string line);
}

在您的 CommandService 類中使用此接口:

private readonly ISerialPortWrapper _serialPort;

public CommandService(string comPort)
   : this(new SerialPortWrapper(new SerialPort(comPort, 9600, Parity.None, 8, StopBits.One) { Handshake = Handshake.None }))
{
}

public CommandService(ISerialPortWrapper serialPortWrapper)
{
    _serialPort = serialPortWrapper;

    try
    {
        _serialPort.Open();
    }
    catch (System.IO.FileNotFoundException)
    {
        throw new Exception($"Serialport { comPort } can't be found");
    }
}

為簡潔起見,我縮短了所有內容,但我希望您能理解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM