# EventBus
**Repository Path**: scriptfan/EventBus
## Basic Information
- **Project Name**: EventBus
- **Description**: 基于 C# 的事件总线
- **Primary Language**: C#
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 4
- **Created**: 2024-04-07
- **Last Updated**: 2024-04-07
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 事件总线
这是一个参照 *Java Sprint* 中的 ApplicationContext.publish(message) 的方法实现的事件总线
## 1 基本信息
### 1.1 安装
通过 Nuget 你就可以安装使用它。
* [.NetFramework](https://www.nuget.org/packages/Reface.EventBus/)
* [.NetCore](https://www.nuget.org/packages/Reface.Core.EventBus/3.2.11)
### 1.2 运行环境
Reface.EventBus 工作在 .NetFramework 上
Reface.Core.EventBus 工作在 .NetCore 上
### 1.3 依赖项
Reface.EventBus 无依赖项
Reface.Core.EventBus 依赖 Microsoft.Extensions.DependencyInjection
## 2 使用方法
### 2.1 消息发布
**定义事件**
```csharp
///
/// 控制台启动后的事件
///
public class ConsoleStarted : Reface.EventBus.Event
{
public ConsoleStarted(object source) : base(source)
{
Console.WriteLine("控件台启动完毕");
}
}
```
**在控制台启动后触发事件**
```csharp
class Program
{
static void Main(string[] args)
{
// 构造事件总线
IEventBus eventBus = new DefaultEventBus();
// 发布消息
eventBus.Publish(new ConsoleStarted());
}
}
```
### 2.2 消息监听
#### 2.2.1 如何监听
实现 IEventListener 即可成为监听者
```csharp
using ConsoleApp1.Events;
using Reface.EventBus;
namespace ConsoleApp1.Listeners
{
public class OnConsoleStarted : IEventListener
{
public void Handle(ConsoleStarted @event)
{
Console.WriteLine("Console Started");
}
}
}
```
#### 2.2.2 如何添加监听者
为了松耦合,我们不会要求手动的将监听者添加到 EventBus 实例中去。
比较简单的方法是通过 config 文件注册监听者。
**在配置文件中定义事件监听者**
1. 添加 section
2. 添加监听者
```xml
```
#### 2.2.3 其它方法添加监听者
除了通过 config 文件的方法,我们还提供了其它方法来注册监听者。
只要实现了 **Reface.EventBus.IEventListenerFinder** 并在构造 DefaultEventBus 时作为参数传入,便可以订制的方式注册监听者。
目前自带的注册方式有:
* **Reface.EventBus.EventListenerFinders.ConfigurationEventListenerFinder** 通过 config 文件来注册
* **Reface.EventBus.EventListenerFinders.AssembliesEventListenerFinder** 通过注册程序集,并返反射其中的类型来得到所有实现了 **Reface.EventBus.IEventListenerFinder** 的成员
* **Reface.EventBus.EventListenerFinders.DefaultEventListenerFinder** 通过编码的方式注册监听者
#### 2.2.4 定义执行顺序
向 **IEventListener** 的实现类再添加 IPrioritized 接口,并实现 **Priority** 属性,便可以指定执行的顺序。
* Priority 的值越小,越先执行
* 未实现 IPrioritized 的 IEventListener 认为 Priority = 0
# 3. 集成
## 3.1 .NetCore 与 ServiceCollection 集成
与 *IOC/DI* 组件的集成,可以免去对监听者一一注册的过程。
在 .NetCore 中,通过为 ServiceCollection 注册必要组件和按程序集注册监听器,可以实现这些功能:
```csharp
var provider = new ServiceCollection()
.AddEventBus() // 添加 EventBus 功能
.AddEventListeners(this.GetType().Assembly)
.AddEventListeners(typeof(IService).Assembly)
.BuildServiceProvider();
IEventBus eventBus = provider.GetService();
eventBus.Publish(new TestEvent());
```