vipwan/Biwen.QuickApi

提供事件总线的发布订阅

Opened this issue · 2 comments

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");
        }
    }
}

修复一个订阅者订阅多个事件的情况

[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;
    }
}

提供IEvent的扩展,使得 事件可以脱离QuickApi 在其他Service中使用 :

public class MyEvent : IEvent
{
    public string? Message { get; set; }
}

await new MyEvent { Message = "1234567890" }.PublishAsync();