我决定在我的 Azure Function 应用程序中使用 MediatR。我在我的 Azure Function 项目中下载了 MediatR v12.1.1。我有一个带有名称服务的依赖项目(类库),其中有查询(实现 IRequest)和处理程序(实现 IRequestHandler
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddMediatR(cfg =>
{
cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly());
});
}
我的功能:
public class SomeName
{
private readonly IMediator _mediator;
public SomeName(IMediator mediator)
{
_mediator = mediator;
}
[FunctionName("SomeName")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req,
ILogger log)
{
var tokenString = req.Query["token"];
var token = Guid.Parse(tokenString);
var query = new GetUserDetail(token);
var result = await _mediator.Send(query);
return result != null ? new OkObjectResult(result) : new NotFoundResult();
}
}
作为 DI 容器,我使用 Autofac。当我运行我的函数时,出现以下错误:
System.Private.CoreLib:执行函数时出现异常:SomeName。 Autofac:请求的服务“MediatR.IRequestHandler`2[Some_info]”尚未注册。为了避免这种异常,可以注册一个组件来提供服务,使用 IsRegistered() 检查服务注册,或者使用 ResolveOptional() 方法来解析可选依赖项。
如何修复该错误?
Assembly.GetExecutingAssembly()
返回包含您的函数的程序集。 Mediatr 扫描它以查找实现 IRequestHandler<,>
接口的类型。由于您在依赖项目中有命令和查询,因此此程序集扫描会导致找到 0 个类型。这意味着你需要通过不同的装配。
你可以尝试一下 通过
RegisterServicesFromAssemblyContaining<AnyTypeFromYourOtherProject>()
进行注册,其中 AnyTypeFromYourOtherProject
是该项目中包含您的请求的类型
示例
.AddMediatR(cfg =>
{
cfg.RegisterServicesFromAssemblyContaining<Class1>();
});
文件夹结构