Skip to content

本地事件

  • 本地事件总线允许服务发布和订阅in-process events.这意味着,如果两个服务 (发布者和订阅者) 在同一进程中运行,则它是合适的。
  • ABP vNext本地事件官方文档

发布事件

  • 有两种发布本地事件的方法

使用 ILocalEventBus 发布事件

csharp
namespace AbpDemo
{
    public class MyService : ITransientDependency
    {
        private readonly ILocalEventBus _localEventBus;

        public MyService(ILocalEventBus localEventBus)
        {
            _localEventBus = localEventBus;
        }
        
        public virtual async Task ChangeStockCountAsync(Guid productId, int newCount)
        {
            await _localEventBus.PublishAsync(
                new StockCountChangedEvent
                {
                    ProductId = productId,
                    NewCount = newCount
                }
            );
        }
    }
}
csharp
namespace AbpDemo
{
    public class StockCountChangedEvent
    {
        public Guid ProductId { get; set; }
        
        public int NewCount { get; set; }
    }
}

在实体/聚合根类中发布事件

  • AggregateRoot类定义添加新的本地事件,该事件在将聚合根对象保存(创建、更新或删除)到数据库中时发布
csharp
namespace AbpDemo
{
    public class Product : AggregateRoot<Guid>
    {
        public string Name { get; set; }
        
        public int StockCount { get; private set; }

        private Product() { }

        public Product(Guid id, string name)
            : base(id)
        {
            Name = name;
        }

        public void ChangeStockCount(int newCount)
        {
            StockCount = newCount;
            
            AddLocalEvent(
                new StockCountChangedEvent
                {
                    ProductId = Id,
                    NewCount = newCount
                }
            );
        }
    }
}

预定义事件

  • abp官方为我们提供了一些预定义的事件,如:EntityCreatedEventData、EntityDeletedEventData、EntityUpdatedEventData,EntityChangedEventData等。

事件说明

- EntityCreatedEventData<T>在成功创建实体后立即发布。
- EntityUpdatedEventData<T>在实体成功更新后立即发布。
- EntityDeletedEventData<T>在成功删除实体后立即发布。
- EntityChangedEventData<T>在成功创建、更新或删除实体后立即发布。

订阅预定义事件

csharp
public class ChangedAbpUserLocalEventHandler: ILocalEventHandler<EntityChangedEventData<AbpUser>>, ITransientDependency
{
    private readonly IDistributedEventBus _distributedEventBus;

    public ChangedAbpUserLocalEventHandler(IDistributedEventBus distributedEventBus)
    {
        _distributedEventBus = distributedEventBus;
    }

    public async Task HandleEventAsync(EntityChangedEventData<AbpUser> eventData)
    {
       // todo: handle event
    }
}

它是如何实现的?

  • 当您将更改保存到数据库时,将发布预构建事件;
  • 对于 EF Core,它们发布在DbContext.SaveChanges上
  • 对于 MongoDB,当您调用存储库的,或方法时,会发布它们(因为MongoDB没有更改跟踪系统).所以在InsertAsync,UpdateAsync,DeleteAsync.

如有转载或 CV 的请标注本站原文地址