MediatR Autofac Handler 在容器中注册

dma*_*509 2 mediatr

我在我的第一个 IMediatR Autofac MVC 项目中遇到了问题。非常感谢您的帮助..提前致谢!

找不到 SliceProject.Services.Query.GetUserListQuery 类型的请求的处理程序。容器或服务定位器配置不正确,或者处理程序未在容器中注册。

Autofac 容器代码:

builder
    .RegisterAssemblyTypes(typeof(IRequest<>).Assembly)
    .Where(t => t.IsClosedTypeOf(typeof(IRequest<>)))
    .AsImplementedInterfaces();    

builder
    .RegisterAssemblyTypes(typeof(IRequestHandler<,>).Assembly)
    .Where(t => t.IsClosedTypeOf(typeof(IRequestHandler<,>)))
    .AsImplementedInterfaces();
Run Code Online (Sandbox Code Playgroud)

Mic*_*iey 6

这是因为您告诉 Autofac 在包含该类型的程序集中查找IRequestHandler<TRequest, TResponse>。该类型存在于 MediatR 程序集中,因此您的处理程序不可能存在于该程序集中。

您必须尝试注册,以便它在定义处理程序的程序集中查找。如果它们全部在一个程序集中定义,请选择一个处理程序并将其用作标记类型。我试图猜测您的一位处理程序的名字:

builder
    .RegisterAssemblyTypes(typeof(GetUserListQueryHandler).Assembly)
    .Where(t => t.IsClosedTypeOf(typeof(IRequestHandler<,>)))
    .AsImplementedInterfaces();
Run Code Online (Sandbox Code Playgroud)

另请注意,使用 Autofac 提供的功能可以使注册变得更简单AsClosedTypesOf。它的作用完全相同。

builder
    .RegisterAssemblyTypes(typeof(GetUserListQueryHandler).Assembly)
    .AsClosedTypesOf(typeof(IRequestHandler<,>)));
Run Code Online (Sandbox Code Playgroud)

最后,这有点无关,但是为什么要尝试在容器中注册请求呢?请求通常由自定义代码创建,而不是从容器中解析。在您的情况下,它也没有任何效果,因为您犯了与处理程序相同的错误,即在 MediatR 程序集中查找请求,该程序集不包含IRequest<TResponse>.