.NET EventBus

本文介绍了一种通过自定义事件总线(EventBus)实现事件解耦的方法。通过创建EventBus类,可以统一管理不同场景下的事件触发与监听,提高了代码的可维护性和扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:希望将自定义事件重代码中解耦,单独管理起来

代码如下:

 public class EventBus<T>
    {
        private EventBus()
        {

        }

        private static EventBus<T> Eve { get; set; }

        public static EventBus<T> CreateInstance()
        {
            if (Eve == null)
            {
                Eve = new EventBus<T>();
            }
            return Eve;
        }

        private Dictionary<string, List<EventHandler>> dic = new Dictionary<string, List<EventHandler>>();

        public void InvockEvent(string eventName)
        {
            if (!Exist(eventName))
            {
                return;
            }
            foreach (var eventHandler in dic[eventName])
            {
                eventHandler.BeginInvoke(this, new EventArgs(), null, null);
            }
        }

        public void AddEvent(string eventName, EventHandler e)
        {
            if (Exist(eventName))
            {
                dic[eventName].Add(e);
            }
            else
            {
                List<EventHandler> list = new List<EventHandler>();
                list.Add(e);
                dic.Add(eventName, list);
            }
        }

        public void RemoveEvent(string eventName)
        {
            if (!Exist(eventName))
            {
                return;
            }
            dic.Remove(eventName);
        }

        public void UpdateEvent(string eventName, EventHandler e)
        {
            RemoveEvent(eventName);
            AddEvent(eventName, e);
        }

        public void AddEventList(string eventName, List<EventHandler> es)
        {
            if (Exist(eventName))
            {
                dic[eventName].AddRange(es);
            }
            else
            {
                List<EventHandler> list = new List<EventHandler>();
                list.AddRange(es);
                dic.Add(eventName, list);
            }
        }

        public void RemoveByhandle(string eventName, EventHandler e)
        {
            if (!Exist(eventName))
            {
                return;
            }
            dic[eventName].Where(c => c == e).ToList().Remove(e);
        }

        private bool Exist(string key)
        {
            return dic.Keys.Contains(key);
        }
    }

没有做深入测试,只是一个大概意思,将event缓存起来,需要的时候,在取出来使用,其实这里

EventBus就算是一个发布者了,然后我们可以写一个订阅者:

 public class InitEvent
    {
        public static EventBus<MyString> ev = EventBus<MyString>.CreateInstance();

        static InitEvent()
        {
            ev.AddEvent("valueChange", (o, e) =>
            {
                Console.WriteLine(1111111);
            });
            ev.AddEvent("valueLengthChange", (o, e) =>
            {
                Console.WriteLine("长度变了");
            });
        }
    }

再写一个使用的:

 public class MyString
    {
        private EventBus<MyString> ev = EventBus<MyString>.CreateInstance();
        private string Str { get; set; }

        public MyString(string str)
        {

            Str = str;
        }

        public string str
        {
            get { return Str; }
            set
            {
                if (value != Str)
                {
                    ev.InvockEvent("valueChange");
                }
                if (value.Length != Str.Length)
                {
                    ev.InvockEvent("valueLengthChange");
                }
                Str = value;
            }
        }
    }

这样就没有必要在MyString中写事件了,达到解耦的目的,我们只需要在InitEvent中写eventhandler就可以了

来测试一下:

 static void Main(string[] args)
        {
            InitEvent evv = new InitEvent();
            MyString ms = new MyString("haha");
            ms.str = "ffff";
            Console.ReadKey();
        }

输出结果:

1111111

换下ms.str,使其长度发生变化:

static void Main(string[] args)
        {
            InitEvent evv = new InitEvent();
            MyString ms = new MyString("haha");
            ms.str = "ffff1";
            Console.ReadKey();
        }

输出结果:

1111111
长度变了

 

转载于:https://www.cnblogs.com/mayuzx/p/7999193.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值