在静态工厂方法中分配事件处理委托

时间:2010-12-02 09:10:27

标签: c# .net

我强烈怀疑我不应该在这里使用静态工厂方法,但是在平均时间我不知道如何实现它。以下代码在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());
} 

3 个答案:

答案 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)

为什么在处理传入数据时会泄露端口?这就像是在寻找麻烦。

调用工厂方法的代码可以(并且可能会)处理传入的数据(定义工厂的类也是如此)。这可能会给你意想不到的行为。

我建议你仔细思考一下你想做什么然后再问。

相关问题