2010-12-02 61 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

爲什麼你放棄的端口,當你正在處理傳入的數據?這就像要求麻煩。

調用工廠方法的代碼可以(也可能會)處理傳入數據(如定義工廠的類)。這可以給你意想不到的行爲。

我建議你通過你想要做的事來想,然後再問。