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

C# 在静态工厂方法中分配事件处理委托,c#,.net,C#,.net,我强烈怀疑我不应该在这里使用静态工厂方法,但与此同时,我不知道如何实现它。以下代码在CreateOpenPort中指定_currentPort_DataReceived的行上给出了编译错误,因为委托方法不是静态的。我如何解决这个问题,最好使用非静态工厂方法 public static SerialPortService CreateOpenPort(string portName, int baudRate, Parity parity, int dataBits, StopBits s

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

嗯,带有静态处理程序的静态工厂不是一个坏主意,尽管为了单元测试,我会尽量避免使用它们


如果AppDomain中只有一个实例,则实现一个单例模式。这将是干净和有效的。

使用单例模式,这样就不需要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()); 
} 

在处理传入数据时,为什么要放弃端口?这就像自找麻烦

调用工厂方法的代码可以并且可能会像定义工厂的类一样处理传入的数据。这会给你带来意想不到的行为


我建议您仔细考虑想做什么,然后再问。

我需要多个SerialPortService实例,或者如果我使用单实例,我需要管理一个私有集合SerialPort实例。后一个选项对于我手头的任务来说太复杂了。我不理解你的设计。如果您有多个SerialPortService实例,并且每个实例都管理它们创建的SerialPort,那么为什么CreatePort方法是静态的?在当前的设计中如何管理它们?静态处理程序如何处理来自多个SerialPort实例的并发事件?它会对它们进行排队吗?它们将在自己的静态方法副本中运行。但是,如果你接触到任何静态,你需要确保你是同步的。我问的是一个一般的设计问题,我传递的参数对这个问题没有什么影响。我在示例中使用的代码非常早,是概念验证代码。我的问题想得够透彻了,谢谢。请不要误解我的意思。我真的很想帮助你。但是如果你描述一下你想要达到的目标,那就容易多了。我可能会想出另一种设计。