Медиатр Полиморфная отправка обработчика запроса не работает

#mediatr #dryioc

#mediatr #dryioc

Вопрос:

У меня есть обработчик запросов Mediatr, который я хочу принять один из двух разных (связанных) запросов. Когда я использую базовый запрос, он работает нормально, но когда я использую PermissionedGetInformationRequest , я получаю сообщение об ошибке, указывающее, что он не может найти обработчик для моего запроса.

Ошибка построения обработчика для запроса типа MediatR.IRequestHandler2[PermissionedGetInformationRequest, просмотр данных]. Зарегистрируйте свои обработчики в контейнере

Я не уверен, что я просто неправильно настроил свой контейнер IoC, или контейнер не поддерживает то, что я пытаюсь сделать, или я пытаюсь сделать что-то, что не поддерживается Mediatr (но я почти уверен, что это так, я, кажется, помню, что у нас был похожий кодэто работало нормально, используя наш старый IoC, StructureMap)

У меня есть запрос:

 public class GetInformationRequest : IRequest<DataIWantView>
{
}
 

и запрос, который наследуется от этого

 public class PermissionedGetInformationRequest : GetInformationRequest  
{
    public int RequesterId { get;set; }
}
 

и обработчик запроса:

 public class GetInformationHandler : IRequestHandler<GetInformationRequest, DataIWantView>
{
    public Task<DataIWantView> Handle(GetInformationRequestrequest, CancellationToken cancellationToken)
    {
        if (request is PermissionedGetInformationRequest permissionedRequest)
        {
            // Check permission
        }

        // Get the data I want
    }
}
 

Я использую dryioc в качестве контейнера IoC, а для регистрации своих обработчиков я использую

 container.RegisterMany(new[] { typeof(GetInformationHandler).Assembly }, Registrator.Interfaces, made: PropertiesAndFields.Auto);
 

Комментарии:

1. Похоже, проблема в DryIoc. Не могли бы вы попытаться разрешить IRequestHandler<PermissionedGetInformationRequest, DataIWantView> напрямую? И после этого попробуйте разрешить массив IRequestHandler<PermissionedGetInformationRequest, DataIWantView>[] ?

2. DryIoc v4.6 выпущен только сейчас с Rules.WithVariantGenericTypesInResolve() . Попробуйте и посмотрите, исчезнет ли ошибка.

3. @dadhi Спасибо, я попытался обновить до версии 4.6 и добавил Rules.WithVariantGenericTypesInResolve() в контейнер, но все еще не могу определить тип. попытка разрешить IRequestHandler<PermissionedGetInformationRequest, DataIWantView> просто выдает ошибку «Нет сервиса для типа», попытка разрешить массив обработчиков возвращается как пустой массив

4. Тогда это что-то другое. Я бы предложил открыть проблему в MediatR и / или в репозиториях DryIoc с уменьшенным неудачным тестом.

Ответ №1:

Проблема была решена с помощью Rules.WithVariantGenericTypesInResolve() . Несмотря на мой первоначальный комментарий выше, я просто неправильно устанавливал правила для контейнера. Как только я установил правило, оно сработало отлично.