寻址事件订阅

本文关键字:事件 寻址 | 更新日期: 2023-09-27 18:13:41

在我的几个项目中,很明显我需要一些比标准。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