2010-12-02 59 views
1

我强烈怀疑我不应该在这里使用静态工厂方法,但是同时我不知道如何实现这一点。以下代码在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

嗯,静态工厂用静态处理并没有那么糟糕的想法,虽然我会尽量避免他们的单元测试的缘故。

实施一个单身人士模式如果有它只有一个AppDomain实例。这将是清洁工作

+0

静态处理程序如何处理来自多个SerialPort实例的并发事件?它排队他们吗? – ProfK 2010-12-02 10:41:28

+0

他们将在自己的静态方法副本中运行。但是,如果您正在触摸任何静态状态,则需要确保已同步。 – Aliostad 2010-12-02 10:51:06

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()); 
} 
+0

我需要SerialPortService的多个实例,或者如果我使用单例我需要管理一个私有的集合SerialPort实例。后一种选择对于我的任务来说太复杂了。 – ProfK 2010-12-02 09:26:29

0

为什么你放弃的端口,当你正在处理传入的数据?这就像要求麻烦。

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

我建议你通过你想要做的事来想,然后再问。