Skip to content

Commit

Permalink
更新了事件API和添加了事件扩展方法 #17
Browse files Browse the repository at this point in the history
新增了一个`EventExtensions.cs`文件,定义了一个`EventExtensions`静态类,该类中定义了一个`PublishAsync`扩展方法,该方法允许`IEvent`类型的对象直接调用`PublishAsync`方法进行事件发布。

相关工作项: #1
  • Loading branch information
vipwan committed May 11, 2024
1 parent 0083a57 commit 2f7c815
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 5 deletions.
13 changes: 8 additions & 5 deletions Biwen.QuickApi.DemoWeb/Apis/EventApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@

namespace Biwen.QuickApi.DemoWeb.Apis
{
public class MyEvent : BaseRequest<MyEvent>,IEvent
public class MyEvent : BaseRequest<MyEvent>, IEvent
{
[FromQuery]
public string? Message { get; set; }
}


public class MyEvent2: IEvent
public class MyEvent2 : IEvent
{
public string? Message { get; set; }
}
Expand Down Expand Up @@ -57,7 +57,7 @@ public override Task HandleAsync(MyEvent @event, CancellationToken ct)
/// <summary>
/// 抛出异常的Handler
/// </summary>
[EventSubscriber(Order =-2,ThrowIfError =false)]
[EventSubscriber(Order = -2, ThrowIfError = false)]
public class MyEventHandler3 : EventSubscriber<MyEvent>
{
private readonly ILogger<MyEventHandler3> _logger;
Expand All @@ -75,7 +75,7 @@ public override Task HandleAsync(MyEvent @event, CancellationToken ct)
/// <summary>
/// 同时订阅多个事件
/// </summary>
[EventSubscriber(IsAsync = true,Order =0, ThrowIfError =false)]
[EventSubscriber(IsAsync = true, Order = 0, ThrowIfError = false)]
public class MyEventHandler4 : IEventSubscriber<MyEvent>, IEventSubscriber<MyEvent2>
{
private readonly ILogger<MyEventHandler4> _logger;
Expand All @@ -101,14 +101,17 @@ public Task HandleAsync(MyEvent2 @event, CancellationToken ct)
[QuickApi("event")]
public class EventApi : BaseQuickApi<MyEvent>
{

public override async ValueTask<IResultResponse> ExecuteAsync(MyEvent request)
{
//publish
await PublishAsync(request);

//publish event2
await PublishAsync(new MyEvent2 { Message = "hello event2" });

//可以使用IEvent扩展方法
await new MyEvent { Message = "1234567890" }.PublishAsync();

return IResultResponse.Content("send event");
}
}
Expand Down
1 change: 1 addition & 0 deletions Biwen.QuickApi/BaseQuickApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ public abstract class BaseQuickApi<Req, Rsp> : IQuickApi<Req, Rsp> where Req : B

public virtual async Task PublishAsync<T>(T @event, CancellationToken cancellationToken = default) where T : IEvent
{
if (ServiceRegistration.ServiceProvider is null) throw new InvalidOperationException("mush UseBiwenQuickApis() first!");
using var scope = ServiceRegistration.ServiceProvider.CreateScope();
var publisher = scope.ServiceProvider.GetRequiredService<Publisher>();
await publisher.PublishAsync(@event, cancellationToken);
Expand Down
20 changes: 20 additions & 0 deletions Biwen.QuickApi/Events/EventExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace Biwen.QuickApi.Events
{
public static class EventExtensions
{
/// <summary>
/// 事件广播扩展
/// </summary>
/// <param name="event"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
/// <exception cref="InvalidOperationException"></exception>
public static async Task PublishAsync<T>(this T @event, CancellationToken cancellationToken = default) where T : IEvent
{
if (ServiceRegistration.ServiceProvider is null) throw new InvalidOperationException("mush UseBiwenQuickApis() first!");
using var scope = ServiceRegistration.ServiceProvider.CreateScope();
var publisher = scope.ServiceProvider.GetRequiredService<Publisher>();
await publisher.PublishAsync(@event, cancellationToken);
}
}
}

0 comments on commit 2f7c815

Please sign in to comment.