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

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

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

Я не уверен, что я просто не настроил свой контейнер 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);

person Anduril    schedule 08.12.2020    source источник
comment
Похоже, проблема в DryIoc. Не могли бы вы попробовать разрешить IRequestHandler<PermissionedGetInformationRequest, DataIWantView> напрямую? И после этого попытаться разрешить массив IRequestHandler<PermissionedGetInformationRequest, DataIWantView>[]?   -  person dadhi    schedule 10.12.2020
comment
DryIoc v4.6 выпущен только что с Rules.WithVariantGenericTypesInResolve(). Попробуйте и посмотрите, исчезнет ли ошибка.   -  person dadhi    schedule 10.12.2020
comment
@dadhi Спасибо, я пробовал обновиться до 4.6 и добавил Rules.WithVariantGenericTypesInResolve() в контейнер, но все еще не могу определить тип. попытка разрешить IRequestHandler<PermissionedGetInformationRequest, DataIWantView> просто выдает ошибку Нет службы для типа, попытка разрешить массив обработчиков просто возвращается как пустой массив   -  person Anduril    schedule 14.12.2020
comment
Тогда это другое дело. Я бы посоветовал открыть проблему в репозиториях MediatR и / или DryIoc с минимизированным неудачным тестом.   -  person dadhi    schedule 15.12.2020


Ответы (1)


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

person Anduril    schedule 22.02.2021