繁体   English   中英

已解决的事件订阅

[英]Addressed event subscription

在我的几个项目中,很明显,我需要比标准.NET事件更强大的功能。

基本上,我希望在消息泵中选择一个选项,即当感兴趣的组件发生更改时,将回调(事件)引发给特定的订阅者。

这可能是一个项目的特定I / O更改状态(例如,按钮关闭触点),或者是从无线以太网接收的另一个项目中特定MAC地址的消息。

我当前的思路是使用字典,并针对每个地址使用代表列表(对于本示例)。

我尚未调试此功能,但是以下内容是否正确?

class CustomSubscription
{
    public delegate void DataReceivedHandler(object sender, DataReceivedEventArgs args);

    public class DataReceivedEventArgs : EventArgs
    {
        public byte[] data;
    }

    private readonly Dictionary<int, List<DataReceivedHandler>> _subscribers;

    public CustomSubscription()
    {
        _subscribers = new Dictionary<int, List<DataReceivedHandler>>();
    }

    public void AddSubscriber(int address, DataReceivedHandler callback)
    {
        if (false == _subscribers.ContainsKey(address))
        {
            _subscribers.Add(address, new List<DataReceivedHandler>());
        }
        _subscribers[address].Add(callback);
    }

    public void RemoveSubscriber(int address, DataReceivedHandler callback)
    {
        if (false == _subscribers.ContainsKey(address))
        {
            return;
        }
        if (_subscribers[address].Contains(callback))
        {
            _subscribers[address].Remove(callback);
        }
    }

    public void HandleIncommingData(int address, object sender, byte[] payload)
    {
        if (false == _subscribers.ContainsKey(address))
        {
            // Nothing subscribed - take no action
            return;
        }

        // Raise callbacks with all subscribers
        foreach (DataReceivedHandler callback in _subscribers[address])
        {
            callback(sender, new DataReceivedEventArgs
                                 {
                                     data = payload
                                 });
        }
    }
}

看起来您正在尝试实现事件聚合器模式。 网络上已经有很多实现。 您可以从这里开始,例如: https : //stackoverflow.com/questions/2343980/event-aggregator-implementation-sample-best-practices

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM