这可能是Inject Func<>参加活动

时间:2013-06-13 14:55:33

标签: c# design-patterns dependency-injection serial-port

我在项目中使用SerialPort_DataReceived事件。但我希望在event的正文中有不同的策略来接收数据。

我用google搜索,我发现一种方法是注入Func<>方法和改变他们的行为(战略模式)。

但是,对SerialPort_DataReceived这样的evnet来说,是否可以这样做呢?如果是,我该怎么做? (不违反原则)

修改

实际上我想将Func<>参数添加到SerialPort_DataReceived像这样:

public Rs232(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits)
        {
            SerialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
            SerialPort.DataReceived += SerialPort_DataReceived;
        }

        private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            throw new NotImplementedException();
        }

我想更改SerialPort_DataReceived,如下所示:

private void SerialPort_DataReceived(Func<sth,sth> Strategy,object sender, SerialDataReceivedEventArgs e)
            {
                throw new NotImplementedException();
            }

2 个答案:

答案 0 :(得分:0)

当然你可以注入一些Func&lt;&gt;到包含DataReceived事件处理程序的类并调用Func&lt;&gt;来自处理程序。

此外,您可以将收到的数据传递给具有一个或多个Func&lt;&gt;的特定处理程序类。根据解码原始字节来处理数据。

答案 1 :(得分:0)

如果你谈到串口的具体问题,我认为这个答案可能不适用。

我想到了一个特定于适配器的模式来处理你的Method Abstraction。假设您已经知道了委托和事件处理程序。

public class DeviceASerialPort{
    public DeviceASerialPort{
        // the parameter below may be self-defined instead of passed
        this.SerialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
        SerialPort.DataReceived += SerialPort_DataReceived;
    }
    private SerialPort;
    //event delegation here (i forgot how to declare delegation
    // let's say the name is also DataReceived

    private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        //null guard
        DataReceived(
            sth=> {
                //custom operation here
                return sth;
            }
            , sender
            , e);
    }
}

最后,您最终可以为该串行端口适配器创建接口,甚至可以注入该函数来扩展抽象。