👆点击关注 回复『面试』👆0元领取面试资料
嘿,C#的编程小伙伴们,今天咱们来聊聊一个让你的应用程序更加“灵活”和“解耦”的神器——事件总线。想象一下,你的应用程序中有很多组件,它们需要相互通信,但你又不想让它们直接依赖对方,这时候,事件总线就像是一个“邮递员”,它负责在组件之间传递消息,让通信变得简单而高效。
事件总线是一个设计模式,它定义了一种发布/订阅的消息传递机制。在这个机制中,发布者(Publisher)将事件发布到总线上,而订阅者(Subscriber)则从总线上订阅自己感兴趣的事件。事件总线负责将这些事件从发布者传递到订阅者,而不需要发布者和订阅者之间有直接的依赖关系。
首先,你需要定义一些事件和它们对应的事件参数。这些事件参数通常包含事件的详细信息,比如事件的类型、发生的时间等。
public class MyEventArgs : EventArgs
{
public string Message { get; }
public MyEventArgs(string message) => Message = message;
}
接下来,你需要创建一个事件总线类,它包含一个字典来存储事件和它们的订阅者。同时,你还需要提供发布和订阅事件的方法。
using System;
using System.Collections.Generic;
public class EventBus
{
private readonly Dictionary<string, List<Delegate>> _eventHandlers = new();
public void Subscribe<TEventArgs>(string eventName, EventHandler<TEventArgs> eventHandler)
{
if (!_eventHandlers.ContainsKey(eventName))
{
_eventHandlers[eventName] = new List<Delegate>();
}
_eventHandlers[eventName].Add(eventHandler);
}
public void Unsubscribe<TEventArgs>(string eventName, EventHandler<TEventArgs> eventHandler)
{
if (_eventHandlers.ContainsKey(eventName))
{
_eventHandlers[eventName].Remove(eventHandler);
}
}
public void Publish<TEventArgs>(string eventName, object sender, TEventArgs eventArgs)
{
if (_eventHandlers.ContainsKey(eventName))
{
foreach (var handler in _eventHandlers[eventName])
{
if (handler is EventHandler<TEventArgs> typedHandler)
{
typedHandler(sender, eventArgs);
}
}
}
}
}
现在,你可以在你的应用程序中使用事件总线了。你需要先创建一个事件总线的实例,然后让发布者和订阅者都使用这个实例来发布和订阅事件。
class Program
{
static void Main(string[] args)
{
var eventBus = new EventBus();
// 订阅事件
eventBus.Subscribe("MyEvent", OnMyEvent);
// 发布事件
eventBus.Publish("MyEvent", this, new MyEventArgs("Hello, Event Bus!"));
// 取消订阅(可选)
// eventBus.Unsubscribe("MyEvent", OnMyEvent);
}
private static void OnMyEvent(object sender, MyEventArgs e)
{
Console.WriteLine(e.Message);
}
}
事件总线是一个强大的设计模式,它可以让你的应用程序更加灵活和可扩展。通过实现一个简单的事件总线,你可以让你的组件之间实现松散的通信,而不需要它们之间有直接的依赖关系。希望今天的分享能对你有所帮助,祝你编程愉快!
👆点击关注 回复『面试』👆0元领取面试资料
原文作者:后端Q;如有侵权,请联系管理员删除。