C# Net Core 之 事件总线(EventBus)

EventBus是一种消息传递模式,用于在应用程序中实现解耦和异步通信。它通常用于在不同组件之间传递事件,而不需要它们直接相互依赖。这种模式特别适用于基于事件驱动的架构,如UI框架和微服务架构。

EventBus 的基本概念

  • 事件:事件是一些发生的事情,通常包含某种数据。事件对象通常包含有关事件的信息。

  • 事件发布者:事件发布者是触发事件的组件。当某个事件发生时,发布者会将事件发布到EventBus。

  • 事件订阅者:事件订阅者是对某个特定事件感兴趣的组件。订阅者会向EventBus注册自己,以便在事件发生时接收到通知。

  • EventBus:EventBus是中介,它管理事件的发布和订阅。它负责将事件从发布者传递给相应的订阅者。

以下是一个简单的案例分享

首先,定义事件基类以及事件处理器

internal abstract class BaseEvent
{
    public BaseEvent()
    {
        Id = Guid.NewGuid().ToString();
    }

    public string Id { get; private set; }
}

internal abstract class BaseEventHandler
{
    public readonly BaseEvent BEvent;

    public BaseEventHandler(BaseEvent baseEvent)
    {
        BEvent = baseEvent;
    }

    public abstract Task Handle();
}

定义IEventBus接口:订阅、发布以及接触订阅

internal interface IEventBus
{
    void Subscribe<TEvent, TEventHandler>(TEvent @event, TEventHandler @eventHandler) where TEvent : BaseEvent 
                                            where TEventHandler : BaseEventHandler;

    void Unsubscribe<TEvent, TEventHandler>(TEvent @event, TEventHandler @eventHandler) where TEvent : BaseEvent
                                              where TEventHandler : BaseEventHandler;

    void UnsubscribeAll<TEvent>() where TEvent : BaseEvent;

    void Publish<TEvent>() where TEvent : BaseEvent;
}

实现事件总线EventBus

internal class EventBus : IEventBus
{
    private ConcurrentDictionary<Type, List<BaseEventHandler>> _eventDict = new();

    public void Subscribe<TEvent, TEventHandler>(TEvent @event, TEventHandler @eventHandler)
        where TEvent : BaseEvent
        where TEventHandler : BaseEventHandler
    {
        if (!_eventDict.ContainsKey(typeof(TEvent)))
        {
            List<BaseEventHandler> eventHandlers = new()
            {
                @eventHandler
            };
            _eventDict.TryAdd(typeof(TEvent), eventHandlers);
        }
        else
        {
            _eventDict[typeof(TEvent)].Add(@eventHandler);
        }
        Console.WriteLine($"Event:{@event.Id} has been subscribe, {typeof(TEvent).Name} Count: {_eventDict[typeof(TEvent)].Count}");
    }

    public void Publish<TEvent>() where TEvent : BaseEvent
    {
        if (_eventDict.TryGetValue(typeof(TEvent), out var events))
        {
            events.ForEach(e =>
            {
                Console.WriteLine($"{typeof(TEvent).Name} invoke");
                e.Handle();
            });
        }
    }

    public void Unsubscribe<TEvent, TEventHandler>(TEvent @event, TEventHandler @eventHandler)
        where TEvent : BaseEvent
        where TEventHandler : BaseEventHandler
    {
        if (_eventDict.TryGetValue(typeof(TEvent), out var events))
        {
            events.RemoveAll(e => e.GetHashCode() == @eventHandler.GetHashCode());
            Console.WriteLine($"Event:{@event.Id} has been removed, {typeof(TEvent).Name} Count: {events.Count}");
        }
    }

    public void UnsubscribeAll<TEvent>() where TEvent : BaseEvent
    {
        if (_eventDict.TryRemove(typeof(TEvent), out _))
        {
            Console.WriteLine($"All {typeof(TEvent).Name} has been removed");
        }
    }
}

创建TestEvent类,进行测试

internal class TestEvent : BaseEvent
{
    public TestEvent(string _message)
    {
        Message = _message;
    }

    public string Message { get; private set; }
}

internal class TestEventHandler : BaseEventHandler
{
    public TestEventHandler(TestEvent baseEvent) : base(baseEvent)
    {
        data = baseEvent;
    }

    public TestEvent data { get; private set; }

    public override Task Handle()
    {
        Console.WriteLine($"Event_Id:{data.Id}, Message:{data.Message}");
        return Task.CompletedTask;
    }
}

调用,打印结果

internal class Program
{
    private static void Main(string[] args)
    {
        IEventBus eventBus = new EventBus();

        TestEvent testEvent = new("Test event `1");
        TestEventHandler testEventHandler = new TestEventHandler(testEvent);
        eventBus.Subscribe(testEvent, testEventHandler);

        testEvent = new TestEvent("Test event `2");
        testEventHandler = new TestEventHandler(testEvent);
        eventBus.Subscribe(testEvent, testEventHandler);

        eventBus.Publish<TestEvent>();

        eventBus.Unsubscribe(testEvent, testEventHandler);

        Console.ReadLine();
    }
}

感谢观看,喜欢的可以收藏,哈哈

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在 Nuxt2 中使用 eventBus 事件总线,可以通过以下步骤实现: 1. 创建一个 eventBus.js 文件 在项目的根目录中,创建一个 eventBus.js 文件,代码如下: ```javascript import Vue from 'vue'; export const eventBus = new Vue(); ``` 这里使用了 Vue 的实例来创建 eventBus,并且将它导出,这样就可以在项目中的任何地方使用它了。 2. 在需要使用 eventBus 的组件中引入 eventBus 在需要使用 eventBus 的组件中,可以使用以下代码来引入 eventBus: ```javascript import {eventBus} from '@/eventBus.js'; ``` 这里的 @ 表示项目的根目录,如果 eventBus.js 文件不在根目录中,那么需要改成相应的路径。 3. 使用 eventBus 发送事件 在需要发送事件的地方,可以使用以下代码来发送事件: ```javascript eventBus.$emit('eventName', data); ``` 这里的 eventName 是事件的名称,data 是传递的数据。 4. 使用 eventBus 监听事件 在需要监听事件的地方,可以使用以下代码来监听事件: ```javascript eventBus.$on('eventName', (data) => { // 处理事件 }); ``` 这里的 eventName 是事件的名称,data 是传递的数据。事件触发后,会执行回调函数中的代码。 总结: 以上就是在 Nuxt2 中使用 eventBus 事件总线的方法,通过使用 eventBus,可以在组件之间方便地进行通信。需要注意的是,eventBus 的使用需要谨慎,过多的使用可能会导致代码的可读性和维护性降低。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值