请求处理程序的Mediatr多态分派不工作

请求处理程序的Mediatr多态分派不工作,mediatr,dryioc,Mediatr,Dryioc,我有一个Mediatr请求处理程序,我想从两个不同(相关)的请求中选择一个。当我使用基本请求时,它可以正常工作,但是当我使用PermissionEdgetingFormationRequest时,我会收到一个错误,表明它找不到我请求的处理程序 为MediatR.IRequestHandler2[PermissionEdgetingFormationRequest,DataIWantView]类型的请求构造处理程序时出错。在容器中注册处理程序 我不确定我是否只是没有正确配置IoC容器,或者容器不支

我有一个Mediatr请求处理程序,我想从两个不同(相关)的请求中选择一个。当我使用基本请求时,它可以正常工作,但是当我使用
PermissionEdgetingFormationRequest
时,我会收到一个错误,表明它找不到我请求的处理程序

为MediatR.IRequestHandler2[PermissionEdgetingFormationRequest,DataIWantView]类型的请求构造处理程序时出错。在容器中注册处理程序

我不确定我是否只是没有正确配置IoC容器,或者容器不支持我正在尝试做的事情,或者我正在尝试做一些Mediatr不支持的事情(但我非常确定,我似乎记得我们有一些类似的代码,使用旧的IoC StructureMap可以正常工作)

我有一个要求:

public class GetInformationRequest : IRequest<DataIWantView>
{
}
和请求处理程序:

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
    }
}

问题已通过使用
规则解决。WithVariantGenericTypesInResolve()
。尽管我在上面发表了最初的评论,但我只是没有正确设置容器的规则。一旦我设置了规则,它就工作得很好。

问题是通过使用
规则解决的。WithVariantGenericTypesInResolve()
。尽管我在上面发表了最初的评论,但我只是没有正确设置容器的规则。一旦我制定了规则,它就完美地工作了。

问题似乎出在我身上。您能否尝试直接解析
IRequestHandler
?然后尝试解析
IRequestHandler[]
的数组?DryIoc v4.6刚刚发布了
规则。WithVariantGenericTypesInResolve()
。试试看错误是否消失。@dadhi谢谢,我已尝试升级到4.6并在容器中添加了
规则。WithVariantGenericTypesInResolve()
,但仍然无法解析类型。尝试解析
IRequestHandler
只会抛出一个错误“类型没有服务”,尝试解析处理程序数组只会返回一个空数组,这是另一回事。我建议在MediatR和/或DryIoc回购协议中以小型失败测试的方式发行。问题似乎出在DryIoc。您能否尝试直接解析
IRequestHandler
?然后尝试解析
IRequestHandler[]
的数组?DryIoc v4.6刚刚发布了
规则。WithVariantGenericTypesInResolve()
。试试看错误是否消失。@dadhi谢谢,我已尝试升级到4.6并在容器中添加了
规则。WithVariantGenericTypesInResolve()
,但仍然无法解析类型。尝试解析
IRequestHandler
只会抛出一个错误“类型没有服务”,尝试解析处理程序数组只会返回一个空数组,这是另一回事。我建议在MediatR和/或DryIoc回购协议中以小型失败测试方式发行。
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
    }
}
container.RegisterMany(new[] { typeof(GetInformationHandler).Assembly }, Registrator.Interfaces, made: PropertiesAndFields.Auto);