我强烈怀疑我不应该在这里使用静态工厂方法,但是在平均时间我不知道如何实现它。以下代码在CreateOpenPort
中指定_currentPort_DataReceived
的行上给出了编译错误,因为该委托方法不是静态的。我该如何解决这个问题,最好使用非静态工厂方法?
public static SerialPortService CreateOpenPort(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits)
{
var service = new SerialPortService
{
_currentPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits)
};
service._currentPort.DataReceived += CurrentPortCharsReceived;
service._currentPort.Open();
return service;
}
void CurrentPortCharsReceived(object sender, SerialDataReceivedEventArgs e)
{
var port = (SerialPort) sender;
var chars = new char[port.BytesToRead];
var x = port.Read(chars, 0, chars.Length);
OnDataReceived(chars.ToString());
}
答案 0 :(得分:0)
嗯,带有静态处理程序的静态工厂并不是一个好主意,尽管为了单元测试我会尝试避免它们。
如果它只是AppDomain中的一个实例,则实现 singleton 模式。那将是 clean 和 working 。
答案 1 :(得分:0)
使用Singleton模式,这使得CreateOpenPort不再是静态的:
public class SerialPortService{
static private service = new SerialPortService();
private SerialPortService(){}
public static GetInstance()
{
return service;
}
public SerialPortService CreateOpenPort(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits)
{
var port = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
port.DataReceived += _currentPort_DataReceived;
port.Open();
return port;
}
void _currentPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
var port = (SerialPort) sender;
var chars = new char[port.BytesToRead];
var x = port.Read(chars, 0, chars.Length);
OnDataReceived(chars.ToString());
}
答案 2 :(得分:0)
为什么在处理传入数据时会泄露端口?这就像是在寻找麻烦。
调用工厂方法的代码可以(并且可能会)处理传入的数据(定义工厂的类也是如此)。这可能会给你意想不到的行为。
我建议你仔细思考一下你想做什么然后再问。