在 nopCommerce 中实现通用事件监听

问题描述

我正在尝试实现一个系统范围的通用 CRUD 跟踪器,用于侦听 CRUD 操作

nopCommerce 中,有以下事件:

EntityInsertedEvent<TEntity>
EntityUpdatedEvent<TEntity>
EntityDeletedEvent<TEntity>

可以通过实现 IConsumer<EntityInsertedEvent<TEntity>> 接口来使用。

IConsumer.cs

public interface IConsumer<T>
{
    void HandleEvent(T eventMessage);
}

实体插入/更新/删除事件.cs

public class EntityInsertedEvent<T> where T : BaseEntity
{
    public EntityInsertedEvent(T entity);

    public T Entity { get; }
}

标准实现是:(仅使用 BaseEntity 触发)

public class EventConsumer :IConsumer<EntityInsertedEvent<BaseEntity>>

尝试:

// compiles but there is a type mismatch between `BaseEntity` and the "EntityEvents"
public class MyConsumer<TEntity> :IConsumer<EntityInsertedEvent<TEntity>> where TEntity: BaseEntity

// does not compile because `TEntity` was not defined
public class MyConsumer :IConsumer<EntityInsertedEvent<TEntity>> where TEntity: BaseEntity

我应该如何实现 MyConsumer

解决方法

这里有一个例子。它是 OrderItem 存储库更新事件的使用者。如果您只想通用事件侦听器,则无法动态注册它。中介者模式不是这样工作的,所以你必须在运行前给出你的类名。

public class OrderItemEventConsumer :
    IConsumer<EntityUpdatedEvent<OrderItem>>
{
    private readonly IOrderService _orderService;
    public OrderItemEventConsumer(IOrderService orderService)
    {
        _orderService = orderService;
    }

    #region Methods
    /// <summary>
    /// Handle order item updated event
    /// </summary>
    /// <param name="eventMessage">Event message</param>
    public void HandleEvent(EntityUpdatedEvent<OrderItem> eventMessage)
    {
        
    }
    #endregion
}

订单商品类型为BaseEntity。

public partial class OrderItem : BaseEntity