问题描述
我正在尝试实现一个系统范围的通用 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