asp.net 不调用MediatR封闭泛型编译器

voj3qocg  于 12个月前  发布在  .NET
关注(0)|答案(1)|浏览(162)

我正在使用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继承的显式类,并修改了泛型参数,然后它就工作了,但这并不是我真正想要实现的。这也很奇怪,事件处理程序的注册保持不变,但继承类调用了事件处理程序方法。

ipakzgxi

ipakzgxi1#

我使用的是一个自定义接口IEventHandlers,它继承自INotificationHandlers。我将我的事件处理程序作为IEventHandlers添加到serviceCollection,当MediatR“搜索”INotificationHandlers以发布我的通知时,没有找到任何东西。

相关问题