#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()
. Несмотря на мой первоначальный комментарий выше, я просто неправильно устанавливал правила для контейнера. Как только я установил правило, оно сработало отлично.