首页 > 解决方案 > SerialPort 类的依赖注入

问题描述

我想删除对SerialPort类的依赖并改用依赖注入。但我不知道该使用哪个接口。SerialPortimplements 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();
}

标签: c#dependency-injectionserial-port

解决方案


可惜SerialPort没有接口。如果您想将它与依赖注入一起使用,则必须创建自己的接口和实现它的类。这个类将只是 .NETSerialPort类的包装器:

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");
    }
}

为了简洁起见,我将所有内容都缩短了,但我希望你能明白。


推荐阅读