提供事件总线的发布订阅
Opened this issue · 2 comments
vipwan commented
using Biwen.QuickApi.Events;
using Microsoft.AspNetCore.Mvc;
namespace Biwen.QuickApi.DemoWeb.Apis
{
public class MyEvent : BaseRequest<MyEvent>,IEvent
{
[FromQuery]
public string? Message { get; set; }
}
public class MyEventHandler : EventSubscriber<MyEvent>
{
private readonly ILogger<MyEventHandler> _logger;
public MyEventHandler(ILogger<MyEventHandler> logger)
{
_logger = logger;
}
public override Task HandleAsync(MyEvent @event, CancellationToken ct)
{
_logger.LogInformation($"msg 2 : {@event.Message}");
return Task.CompletedTask;
}
}
/// <summary>
/// 更早执行的Handler
/// </summary>
public class MyEventHandler2 : EventSubscriber<MyEvent>
{
private readonly ILogger<MyEventHandler> _logger;
public MyEventHandler2(ILogger<MyEventHandler> logger)
{
_logger = logger;
}
public override Task HandleAsync(MyEvent @event, CancellationToken ct)
{
_logger.LogInformation($"msg 1 : {@event.Message}");
return Task.CompletedTask;
}
}
/// <summary>
/// 抛出异常的Handler
/// </summary>
[EventSubscriber(Order =-2,ThrowIfError =false)]
public class MyEventHandler3 : EventSubscriber<MyEvent>
{
private readonly ILogger<MyEventHandler> _logger;
public MyEventHandler3(ILogger<MyEventHandler> logger)
{
_logger = logger;
}
public override Task HandleAsync(MyEvent @event, CancellationToken ct)
{
throw new Exception("error");
}
}
[QuickApi("event")]
public class EventApi : BaseQuickApi<MyEvent>
{
public override async ValueTask<IResultResponse> ExecuteAsync(MyEvent request)
{
//publish event
await PublishAsync(request);
return IResultResponse.Content("send event");
}
}
}
vipwan commented
修复一个订阅者订阅多个事件的情况
[EventSubscriber(IsAsync = true,Order =0, ThrowIfError =false)]
public class MyEventHandler4 : IEventSubscriber<MyEvent>, IEventSubscriber<MyEvent2>
{
private readonly ILogger<MyEventHandler4> _logger;
public MyEventHandler4(ILogger<MyEventHandler4> logger)
{
_logger = logger;
}
public Task HandleAsync(MyEvent @event, CancellationToken ct)
{
_logger.LogInformation($"muti msg 1 : {@event.Message}");
return Task.CompletedTask;
}
public Task HandleAsync(MyEvent2 @event, CancellationToken ct)
{
_logger.LogInformation($"muti msg 2 : {@event.Message}");
return Task.CompletedTask;
}
}
vipwan commented
提供IEvent的扩展,使得 事件可以脱离QuickApi
在其他Service中使用 :
public class MyEvent : IEvent
{
public string? Message { get; set; }
}
await new MyEvent { Message = "1234567890" }.PublishAsync();