Projects

CodeWF.EventBus

行程內事件总线,支持 Command、Query 和多种 IOC 场景

使用說明

CodeWF.EventBus

CodeWF.EventBus

CodeWF.EventBus 是一個輕量的進程內事件匯流排庫,適合在 WPF、WinForms、Avalonia UI、ASP.NET Core 和控制台程式中做模組解耦。它支援 Command 命令分發,也支援 Query<T> 查詢回傳,便於實現簡單 CQRS。

適合場景

  • 桌面應用模組之間不想直接引用彼此的服務或 ViewModel。
  • ASP.NET Core 中希望用輕量事件匯流排拆分控制器、業務處理器和查詢邏輯。
  • 控制台、WinForms、WPF 或 Avalonia 專案沒有統一的 IOC 容器,但仍想用訂閱發佈解耦流程。
  • 希望比 MediatR 更小、更少框架約束,同時保留 Command/Query 思路。

套件選擇

套件 適用場景
CodeWF.EventBus 無 IOC 容器或手動訂閱。
CodeWF.AspNetCore.EventBus ASP.NET Core / MS.DI。
CodeWF.DryIoc.EventBus DryIoc / Prism。
CodeWF.IOC.EventBus 其他 IOC 容器,透過回呼接入註冊和解析能力。

核心類型

public abstract class Command
{
}

public abstract class Query<TResponse> : Command
{
    public abstract TResponse Result { get; set; }
}

範例:

public sealed class CreateProductCommand : Command
{
    public string Name { get; set; } = string.Empty;
    public decimal Price { get; set; }
}

public sealed class ProductQuery : Query<ProductItemDto?>
{
    public Guid ProductId { get; set; }
    public override ProductItemDto? Result { get; set; }
}

處理器寫法

事件處理方法使用 [EventHandler] 標記,參數只能有一個,且必須繼承自 Command。回傳值支援 voidTask,方法可以是 publicprivatestatic

[Event]
public sealed class ProductEventHandler
{
    [EventHandler]
    private async Task HandleCreateAsync(CreateProductCommand command)
    {
        await Task.CompletedTask;
    }

    [EventHandler(Order = 1)]
    private void HandleQuery(ProductQuery query)
    {
        query.Result = new ProductItemDto
        {
            Id = query.ProductId,
            Name = "Demo",
            Price = 99
        };
    }
}

無 IOC 容器

public sealed class MainViewModel
{
    private readonly IEventBus _eventBus = EventBus.Default;

    public MainViewModel()
    {
        _eventBus.Subscribe(this);
    }

    [EventHandler]
    private void Handle(UpdateTimeCommand command)
    {
        Console.WriteLine(command.Time);
    }
}

發佈命令和查詢:

await EventBus.Default.PublishAsync(new CreateProductCommand
{
    Name = "XiaoMi",
    Price = 8999
});

var product = await EventBus.Default.QueryAsync(new ProductQuery
{
    ProductId = Guid.NewGuid()
});

實例物件不再使用時,建議主動取消訂閱:

EventBus.Default.Unsubscribe(this);

ASP.NET Core

using CodeWF.AspNetCore.EventBus;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();
builder.Services.AddEventBus();

var app = builder.Build();

app.MapControllers();
app.UseEventBus();

app.Run();

AddEventBus() 會掃描組件中的 [Event] 類別並註冊到容器中,UseEventBus() 會把掃描到的處理器接入事件匯流排。

倉庫