我在我的第一个 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)
这是因为您告诉 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>.
| 归档时间: |
|
| 查看次数: |
4196 次 |
| 最近记录: |