我正在使用MediatR的缓存失效,例如我的应用程序中每个实体的Created,Updated和Rewrite事件。
我正在使用一些逻辑将处理程序添加到我的服务集合中,但简化的版本看起来像这样:
collection.AddTransient(
typeof(IEventHandler<UpdatedEvent<RefreshToken, RefreshTokenId>>),
typeof(UpdatedEventHandler<IRefreshTokenRepository, RefreshToken, RefreshTokenId, IRefreshTokenDto, UpdatedEvent<RefreshToken, RefreshTokenId>>));
字符串
我将如何发布通知的示例如下所示:
await _mediator.Publish(new UpdatedEvent<RefreshToken, RefreshTokenId>(new RefreshToken(new UserId())), cancellationToken);
型
UpdatedEventList的实现看起来像这样:
public class UpdatedEventHandler<TIRepository, TEntity, TId, TIDto, TUpdated> : IEventHandler<TUpdated>
where TUpdated : UpdatedEvent<TEntity, TId>
where TIRepository : IRepository<TEntity, TId, TIDto>
where TEntity : Entity<TId>
where TId : IdObject<TId>
where TIDto : IDto<TId>
{
private readonly TIRepository _repository;
public UpdatedEventHandler(TIRepository repository)
{
_repository = repository;
}
public Task Handle(TUpdated updatedEvent, CancellationToken cancellationToken)
{
var _cacheKeys = GetBaseCacheKeysAsync(updatedEvent);
return _repository.ClearCacheAsync(_cacheKeys);
}
private async IAsyncEnumerable<string> GetBaseCacheKeysAsync(TUpdated updatedEvent)
{
yield return await repository.EntityValueCacheKeyAsync(nameof(_repository.GetByIdAsync),
updatedEvent.Updated.Id.Value.ToString());
yield return await repository.EntityCacheKeyAsync(nameof(_repository.GetListAsync));
await foreach (var cacheKey in GetCacheKeysAsync(updatedEvent))
{
yield return cacheKey;
}
}
protected virtual IAsyncEnumerable<string> GetCacheKeysAsync(TUpdated updatedEvent)
{
throw new NotImplementedException("Override this method to add additional cache keys.");
}
}
型
我尝试了不同的方法,但无论我做什么,事件处理程序都不会被调用。
我确实尝试实现了从updatedEventEvent继承的显式类,并修改了泛型参数,然后它就工作了,但这并不是我真正想要实现的。这也很奇怪,事件处理程序的注册保持不变,但继承类调用了事件处理程序方法。
1条答案
按热度按时间ipakzgxi1#
我使用的是一个自定义接口IEventHandlers,它继承自INotificationHandlers。我将我的事件处理程序作为IEventHandlers添加到serviceCollection,当MediatR“搜索”INotificationHandlers以发布我的通知时,没有找到任何东西。